【问题标题】:Difference in regex between Python and Rubular?Python和Rubular之间正则表达式的区别?
【发布时间】:2010-05-09 22:24: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()吗?

【问题讨论】:

  • pythex.org 表示即使使用 Python 引擎,正则表达式也会匹配该字符串,所以问题在于您如何使用正则表达式(我不知道 Python)
  • 另外,我个人会将您的正则表达式更新为(Prerequisite|Recommended): ([\w -]*),这样您就可以更好地捕捉比赛的其余部分。 (见rubular.com/r/5v7u66vc1M

标签: python regex rubular


【解决方案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')

另外,如果你想匹配“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.')

前面的模式加上文字'.',在这个例子中返回与.*相同的结果。

【讨论】:

  • ...或者(.*?\.) 只匹配第一个期间。
猜你喜欢
  • 1970-01-01
  • 2012-06-01
  • 2013-09-18
  • 2016-11-18
  • 2012-02-22
  • 2023-04-07
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
相关资源
最近更新 更多