我正在尝试通过pattern.findall匹配字符串中的所有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']

===============>>#1 票数: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')]

要解决此问题,您可以使用非捕获组 ,例如

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

它给出以下输出

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

===============>>#2 票数:1

它的正常工作,你只拍摄192021的捕获组的(19|20|21)

根据文档中的说明,您需要将非捕获组更改为(?:19|20|21)

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

===============>>#3 票数: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']

===============>>#4 票数:0

另一种选择是避免使用findall()而是

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

finditer()为您提供了可迭代的产生Match对象。 可以查询每个匹配项的属性。

另一个解决方案在正则表达式的功能方面更为优雅,但由于您对应该返回的组没有这种隐式假设,因此该解决方案更加灵活。

  ask by ssj translate from so

未解决问题?本站智能推荐: