我正在尝试通过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']

最佳答案

引用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']

关于python - re.Pattern.findall工作错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23191789/

10-12 18:38