python中的正则表达式-可选短语有问题

python中的正则表达式-可选短语有问题,python,regex,Python,Regex,我需要一个小脚本来过滤给定文本中的文献引用。参考可以采用两种格式: 布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉 通过两次搜索查找这些引用,可以找到: matches1 = re.findall('\([A-Z]\w*,\s?\d\

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

布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉

通过两次搜索查找这些引用,可以找到:

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)。我不清楚为什么会发生这种情况,也不清楚我做错了什么,所以非常感谢您的帮助:)


谢谢

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

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{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)