2010-05-09 2 views
1

В Rubular, я создал регулярное выражение:Разница в регулярном выражении между Python и Rubular?

(Prerequisite|Recommended): (\w|-|)* 

Это соответствует Bolded:

Рекомендовано: хороший уровень комфорта с компьютерами и некоторые из искусств.

Летом. 2 кредита. Необходимое условие: пре-первокурсник или разрешение инструктор. Кредит не может быть применен к инженерной степени. S-U оценки только.

Вот использование регулярных выражений в 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()?

+2

http://pythex.org/ говорит, что регулярное выражение совпадает с этой строкой, даже с использованием механизма Python, поэтому проблема заключается в том, как вы используете регулярное выражение (я не знаю Python). – Gareth

+1

Кроме того, я лично обновите свое регулярное выражение до '(Предварительное условие | Рекомендованное): ([\ w -] *)', чтобы вы могли лучше отобразить оставшуюся часть совпадения. (См. Http://rubular.com/r/5v7u66vc1M) – Gareth

ответ

2

Вы хотите использовать 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.') 

В предыдущей модели с добавлением символа «», возвращает то же самое, как .* для этого примера.

+1

... или, может быть, '(. *? \.)', Чтобы соответствовать только до первого периода. –