Я посмотрел на форумы, но не смог точно определить, как именно решить мою проблему.
Скажем, у меня есть строка вроде следующего:
UDK .636.32/38.082.4454.2(575.3)
и я хотел бы совместить выражение с регулярным выражением, фиксируя фактическое число (в этом случае ".636.32/38.082.4454.2 (575.3)").
Могут существовать некоторые символы мусора между "UDK" и фактическим числом, а такие символы, как ".", "/" Или "-", являются действительными частями номера. По сути, это число цифр, разделенных некоторыми разрешенными символами.
То, что я придумал, - это следующее регулярное выражение:
'UDK.*(\d{1,3}[\.\,\(\)\[\]\=\'\:\"\+/\-]{0,3})+'
но он не группирует '.636.32/38.082.4454.2 (575.3)'! Это оставляет меня не более чем последней цифрой последней группы (3 в этом случае).
Любая помощь будет принята с благодарностью.
Во-первых, вам нужен не-жадный .*?
, Во-вторых, вам не нужно избегать некоторых символов в [ ]
. В-третьих, вы можете просто рассматривать его как последовательность цифр и некоторые допустимые символы? Почему существует \d{1,3}
но 4454
?
>>> re.match(r'UDK.*?([\d.,()\[\]=\':"+/-]+)', s).group(1)
'.636.32/38.082.4454.2(575.3)'
Не так много прямого ответа на вашу проблему, но общий совет регулярного выражения: используйте Kodos (http://kodos.sourceforge.net/). Это просто потрясающе для составления/тестирования регулярных выражений. Вы можете ввести некоторый образец текста и "опробовать" регулярные выражения против него, увидеть, какие совпадения, группы и т.д. Он даже генерирует код Python, когда вы закончите. Хорошая вещь.
Изменение: с помощью Kodos я придумал:
UDK.*?(?P<number>[\d/.)(]+)
как регулярное выражение, которое соответствует данному примеру. Код, который производит Kodos, это:
import re
rawstr = r"""UDK.*?(?P<number>[\d/.)(]+)"""
matchstr = """UDK .636.32/38.082.4454.2(575.3)"""
# method 1: using a compile object
compile_obj = re.compile(rawstr)
match_obj = compile_obj.search(matchstr)
# Retrieve group(s) by name
number = match_obj.group('number')
^UDK.*?([\d.,()\[\]=\':"+/-]+)$
. Другими словами, «число» - это последняя группа подходящих символов, если некоторые из этих символов также появляются среди «мусорных символов» в середине, это не будет путать регулярное выражение.