Разница в регулярных выражениях между Python и Rubular?
В Rubular я создал регулярное выражение:
(Prerequisite|Recommended): (\w|-| )*
Это соответствует жирному шрифту:
Рекомендуется: хороший уровень комфорта с компьютерами и некоторыми видами искусства.
Летом. 2 кредита. Обязательное условие: предварительная подготовка первокурсника или разрешение инструктора. Кредит не может быть применен к инженерной степени. Только оценки СУ.
Вот использование регулярного выражения в Python:
note_re = re.compile(r'(Prerequisite|Recommended): (\w|-| )*', re.IGNORECASE)
def prereqs_of_note(note):
match = note_re.match(note)
if not match:
return None
return match.group(0)
К сожалению, код возвращается None
вместо спички:
>>> import prereqs
>>> result = prereqs.prereqs_of_note("Summer. 2 credits. Prerequisite: pre-fres
hman standing or permission of instructor. Credit may not be applied toward engi
neering degree. S-U grades only.")
>>> print result
None
Что я здесь не так делаю?
ОБНОВЛЕНИЕ: мне нужно re.search()
вместо re.match()
?
1 ответ
Вы хотите использовать re.search()
потому что он сканирует строку. Ты не хочешь re.match()
потому что он пытается применить шаблон в начале строки.
>>> import re
>>> s = """Summer. 2 credits. Prerequisite: pre-freshman standing or permission of instructor. Credit may not be applied toward engineering degree. S-U grades only."""
>>> note_re = re.compile(r'(Prerequisite|Recommended): ([\w -]*)', re.IGNORECASE)
>>> note_re.search(s).groups()
('Prerequisite', 'pre-freshman standing or permission of instructor')
Кроме того, если вы хотите найти совпадение после первого периода, следующего за словом "преподаватель", вам нужно добавить литерал "." в ваш шаблон:
>>> re.search(r'(Prerequisite|Recommended): ([\w -\.]*)', s, re.IGNORECASE).groups()
('Prerequisite', 'pre-freshman standing or permission of instructor. Credit may not be applied toward engineering degree. S-U grades only.')
Я бы посоветовал вам сделать ваш шаблон более жадным и подходящим для остальной части строки, если только это не совсем то, чего вы хотите, хотя кажется, что вы это делаете.
>>> re.search(r'(Prerequisite|Recommended): (.*)', s, re.IGNORECASE).groups()
('Prerequisite', 'pre-freshman standing or permission of instructor. Credit may not be applied toward engineering degree. S-U grades only.')
Предыдущий шаблон с добавлением литерала '.' Возвращает так же, как .*
для этого примера.