我在 python 中遇到了一个复杂的问题。
我想在控制台中打印匹配出现次数和字符串,如下所示:https://regex101.com/r/yA4wS1/1
正如您所看到的,在线正则表达式测试器会突出显示匹配项,以便您可以看到整个匹配项及其长度。
我想在我的代码中做同样的事情
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
p = re.compile(ur'(\w)\1\1\1+', re.MULTILINE)
test_str = u'aaaaaadgfdhgfbbbbgggee)ehje ekekkkkkeefh ehfeff88888éh\"hr ekkKKKKK\njhxjhjhhhhh\nthe the\n\"eeeeeeeeaaaabcaaaaadexxxdddzdzzzz\"\n\"eeeeeeeeaaaabcaaaaadexxxdddzdzzzz\"\n\"eeeeeeeeaaaabcaaaaadexxxdddzdzzzz\"\n\"aaaeeeeeeeeaaaadzxzzzzffffrrrr\"\n\"aaa\"'
#m = re.findall(p, test_str)
m = p.findall(test_str)
print (m)
但是 python 只是打印组列表(一个字符大小的字符串列表)
/home/nixmind/devspace/py_algo> ./str_count_match_re.py
[u'a', u'b', u'k', u'8', u'K', u'h', u'e', u'a', u'a', u'z', u'e', u'a', u'a', u'z', u'e', u'a', u'a', u'z', u'e', u'a', u'z', u'f', u'r']
我想要的是打印整个匹配位置(指所有连续的字符序列),以及匹配的子字符串的长度。
有人可以帮助使用re模块实现这一目标吗?
谢谢。
最佳答案
re.findall
返回捕获的子匹配。
Return all non-overlapping matches of pattern in string, as a list of strings*... If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group.
您可以使用re.finditer()
允许轻松访问所有匹配的组,包括第 0 个组(即整场比赛):
Return an iterator yielding MatchObject instances over all non-overlapping matches for the RE pattern in string.
示例代码:
import re
p = re.compile(ur'(\w)\1\1\1+')
test_str = u'aaaaaadgfdhgfbbbbgggee)ehje ekekkkkkeefh ehfeff88888éh\"hr ekkKKKKK\njhxjhjhhhhh\nthe the\n\"eeeeeeeeaaaabcaaaaadexxxdddzdzzzz\"\n\"eeeeeeeeaaaabcaaaaadexxxdddzdzzzz\"\n\"eeeeeeeeaaaabcaaaaadexxxdddzdzzzz\"\n\"aaaeeeeeeeeaaaadzxzzzzffffrrrr\"\n\"aaa\"'
print ([x.group(0) for x in p.finditer(test_str)])
请注意,这里的 re.MULTILINE
是多余的,因为模式中没有 ^
也没有 $
来重新定义其行为。
关于Python重新模块findall并打印整个匹配子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34088878/