Python re模块findall并打印整个匹配子字符串

时间:2015-12-04 12:53:03

标签: python regex

我在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 juste打印组列表(一个字符大小的字符串列表)

/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']

我想要的是打印整个匹配位置(表示所有连续的字符序列),以及匹配的子字符串的长度。

有人可以通过重新模块帮助实现目标吗?

感谢。

1 个答案:

答案 0 :(得分:3)

re.findall返回捕获的子匹配。

  

返回字符串中pattern的所有非重叠匹配,作为字符串列表* ...如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。

您可以使用re.finditer()来轻松访问所有匹配的群组,包括第0个群组(即整个匹配):

  

返回一个迭代器,在字符串中的RE模式的所有非重叠匹配上产生 MatchObject 实例。

示例代码:

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)])

请参阅IDEONE demo

请注意,此处re.MULTILINE是多余的,因为模式中没有^$来重新定义行为。

相关问题