re.Pattern.findall工作错误

时间:2014-04-21 06:06:21

标签: python regex python-2.7

我试图通过pattern.findall匹配字符串中的所有模式,但它只能部分地工作

#--coding:UTF-8 --
import re
import pprint
regex = r"(19|20|21)\d{2}"
text = "1912 2013 2134"
def main():
    pattern = re.compile(regex)
    print pattern.findall(text)

if __name__ == '__main__':
    main()

并打印:

['19', '20', '21']

是否应打印['1912', '2013','2134']

4 个答案:

答案 0 :(得分:3)

引用re.findall文档,

  

如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。

由于您的原始RegEx有一个捕获组((19|20|21)),因此返回了仅在该捕获组中捕获的值。你可以像这样玩

regex = r"(19|20|21)(\d{2})"

现在我们有两个捕获组((19|20|21)(\d{2}))。那么结果就是

[('19', '12'), ('20', '13'), ('21', '34')]

要解决此问题,您可以使用non-capturing group,就像这样

regex = r"(?:19|20|21)\d{2}"

,它提供以下输出

['1912', '2013', '2134']

答案 1 :(得分:1)

它工作正常,您只在19的捕获组中捕获2021(19|20|21)

您需要将非捕获组更改为(?:19|20|21),如文档中那样。

来源:https://docs.python.org/2/howto/regex.html#non-capturing-and-named-groups

答案 2 :(得分:1)

圆括号表示匹配的组。在你的正则表达式中,你正在寻找两位数字,分别是19,20或21。

也许你需要这个正则表达式:

r'19\d{2}|20\d{2}|21\d{2}'

这会查找以19开头,后跟两位数字或20后跟两位数字或21后跟两位数的任何数字。

演示:

In [1]: import re
In [2]: regex =rr'19\d{2}|20\d{2}|21\d{2}'
In [3]: text = "1912 2013 2134"
In [4]: pattern = re.compile(regex)
In [5]: pattern.findall(text)
Out[5]: ['1912', '2013', '2134']

答案 3 :(得分:0)

另一种选择可能是避免findall()而不是

print [i.group(0) for i in pattern.finditer(text)]

finditer()为您提供了一个可迭代的Match个对象。可以查询每场比赛的属性。

另一个解决方案是关于正则表达式能够更加优雅,但是这个更灵活,因为你没有关于应该返回的组的隐含假设。