Регулярное выражение захватывает все совпадение, состоящее из повторяющихся групп

1

Я посмотрел на форумы, но не смог точно определить, как именно решить мою проблему.

Скажем, у меня есть строка вроде следующего:

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 в этом случае).

Любая помощь будет принята с благодарностью.

Теги:

2 ответа

5

Во-первых, вам нужен не-жадный .*? , Во-вторых, вам не нужно избегать некоторых символов в [ ]. В-третьих, вы можете просто рассматривать его как последовательность цифр и некоторые допустимые символы? Почему существует \d{1,3} но 4454?

>>> re.match(r'UDK.*?([\d.,()\[\]=\':"+/-]+)', s).group(1)
'.636.32/38.082.4454.2(575.3)'
  • 0
    Почему в классе char столько символов?
  • 0
    Вопрос до сих пор не совсем понятен, но я предлагаю вам добавить якоря: ^UDK.*?([\d.,()\[\]=\':"+/-]+)$ . Другими словами, «число» - это последняя группа подходящих символов, если некоторые из этих символов также появляются среди «мусорных символов» в середине, это не будет путать регулярное выражение.
Показать ещё 5 комментариев
0

Не так много прямого ответа на вашу проблему, но общий совет регулярного выражения: используйте 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')

Ещё вопросы

Сообщество Overcoder
Наверх
Меню