Регулярное выражение Python работает без дополнительной группы, но разрывается с дополнительной группой - PullRequest
0 голосов
/ 22 февраля 2019

С учетом ввода:

line = " say hi /* comment"

и регулярного выражения:

regex = re.compile(r'\s*(?P<command>.*?)/[/*]')
result = regex.search(line)
print(result.group('command'))

Это успешно выведет say hi.

Однако переключение последней части нанеобязательная группа:

regex = re.compile(r'\s*(?P<command>.*?)(/[/*])?')

теперь ничего не печатает.Это не регулярное выражение не соответствует ему вообще, потому что result не None.

Почему это работает, когда регулярное выражение не является необязательным, но перестает работать, когда оно необязательно,и как бы я решил это?

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Возможно, это не тот ответ, который вы ищете, но он может помочь:

regex = re.compile(r'\s*(?P<command>.*?)/[/*](?P<optional>.*)')
result = regex.search(line)
print(result.group('command','optional'))

вывод:

('say hi ', ' comment')

Для получения подробной информации нажмите здесь

0 голосов
/ 22 февраля 2019

В приведенном выше примере ?P<command>.*? используют некожадные квалификаторы * ?, + ?, ?? или {m, n}?, Которые соответствуют как можно меньшему количеству текста.См. Жадность против не-Жадности для получения более подробной информации

И поскольку (/[/*])? является необязательным, группа команды *1007* может не совпадать ни с чем.

Если вы хотите пересмотреть строку без комментариев, используйте следующую строку

\s*(?P<command>.*?)(?:/[/*]|$)

для соответствия

" say hi /* comment"
" say hi ..."
0 голосов
/ 22 февраля 2019

regex.search() найдет первое совпадение подстроки.В этом случае вы можете использовать regex.findall().

regex.search() документы сказали:

Если найдено более одного совпадения, будет возвращено только первое совпадение совпадения

Поскольку /[/*] необязательно, он не имеет ограничений для соответствия символу /.Таким образом, он может даже соответствовать первому пробелу, он может соответствовать любой части.

Вы можете проверить это регулярное выражение онлайн в regex101 .Вы можете найти его процесс и результаты.

...