Python和Rubular中正则表达式的区别?

1 投票
1 回答
863 浏览
提问于 2025-04-15 22:31

在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.')

在之前的匹配规则中加上字面上的 '.',对于这个例子来说,返回的结果和 .* 是一样的。

撰写回答