我试图通过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']
答案 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
的捕获组中捕获20
,21
,(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
个对象。可以查询每场比赛的属性。
另一个解决方案是关于正则表达式能够更加优雅,但是这个更灵活,因为你没有关于应该返回的组的隐含假设。