Python和Rubular中正则表达式的区别?
在Rubular这个工具里,我创建了一个正则表达式:
(Prerequisite|Recommended): (\w|-| )*
它可以匹配加粗的部分:
推荐:对电脑和一些艺术有良好的舒适度。
夏季。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()
吗?
1 个回答
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')
另外,如果你想匹配“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.')
在之前的匹配规则中加上字面上的 '.',对于这个例子来说,返回的结果和 .*
是一样的。