python中的正则表达式在使用可选短语时遇到麻烦

2024-06-26 17:50:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一个小脚本,从给定的文本过滤参考文献。引用可以采用两种格式:

布拉布拉布拉布拉布拉布拉(斯诺登,2014a)布拉布拉布拉布拉布拉布拉布拉布拉(布什和布莱尔,2005)布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉。你知道吗

通过两次搜索查找这些引用:

matches1 = re.findall('\([A-Z]\w*,\s?\d\d\d\d[a-z]?\)', line)
matches2 = re.findall('\([A-Z]\w* and [A-Z]\w*,\s?\d\d\d\d[a-z]?\)', line)

这些搜索正确地找到(Snowden,2014a)resp。(布什和布莱尔,2005年)。但现在我想在一次搜索中找到这两种引用,但都失败了:

matches1 = re.findall('\([A-Z]\w*( and [A-Z]\w*)?,\s?\d\d\d\d[a-z]?\)', line)

此搜索返回“”而不是(Snowden,2014a)和“and Blair”而不是(Bush and Blair,2005)。我不清楚为什么会这样或者我做错了什么,所以非常感谢您的帮助:)

谢谢!你知道吗


Tags: and文本re脚本格式lineresp参考文献
2条回答

通过添加?:,使您的可选组不被捕获:

In [8]: re.findall('\([A-Z]\w*(?: and [A-Z]\w*)?,\s?\d\d\d\d[a-z]?\)', line)
Out[8]: ['(Snowden, 2014a)', '(Bush and Blair, 2005)']

只需将捕获组转换为非捕获组,并将\d\d\d\d减少为\d{4}。因为re.findall优先考虑组。如果存在任何组,它将只打印组中存在的字符。它忘记了匹配的字符串。你知道吗

\([A-Z]\w*(?: and [A-Z]\w*)?,\s?\d{4}[a-z]?\)

示例代码:

>>> import re
>>> s = """foo bar (Snowden, 2014a)
... (Bush and Blair, 2005) foo bar"""
>>> m = re.findall(r'\([A-Z]\w*(?: and [A-Z]\w*)?,\s?\d{4}[a-z]?\)', s, re.M)
>>> for i in m:
...     print i
... 
(Snowden, 2014a)
(Bush and Blair, 2005)

相关问题 更多 >