如何与re.findall()重叠匹配?
问题描述:
import re
x=" tex1 text2 taxw ello how are 123 "
y=x.split()
sear=re.compile(r'\s*\w*[x]\w*\s*')
a=sear.findall(x)
print(a)
我输出作为如何与re.findall()重叠匹配?
[' tex1 ', 'text2 ', 'taxw ']
其中仅tex1
遵循上述标准而'text2 ', 'taxw '
不具有在开始空间。
我试图找出发现
- 的空间任何没有在一开始的模式
- 那么任何数目的字符
- 然后字母“X”
- 那么任何字符数
- ,最后没有任何空格
答
注意'tex1 '
,' text2 '
和' taxw '
是重叠的,并且text2
之前taxw
的空间相匹配,并在先前迭代期间由图案消耗。
你可以做的是把最后的\s*
成捕获组,只是用整场比赛串连它:
import re
x=" tex1 text2 taxw ello how are 123 "
y=x.split()
sear=re.compile(r'\s*\b\w*x\w*\b(?=(\s*))')
a=["{}{}".format(x.group(),x.group(1)) for x in sear.finditer(x)]
print(a) # => [' tex1 ', ' text2 ', ' taxw ']
的(?=(\s*))
是一种非消耗正前瞻那不会移动正则表达式索引,因此它可以在之后的匹配之前匹配前面的空格。
答
我觉得这样才能正则表达式的帮助:
\s+\w*x\w*(?=\s+|$)
然后打印a
后的空间)。
\s+ at least one space before characters
\w* 0 or more characters
x x character
\w* 0 or more characters
(?=\s+|$) followed by at least one space or end of line
答
为了配合重叠的字符串,你可以使用由解决方法把图案的前瞻内的使用捕获组:
re.findall(r'(?=(\s*\b\w*x\w*\s*))\s*.', x)
当定义了一个捕获组,re.findall
只返回的内容捕获组在其结果列表中。
\s*.
(即也可以写\s*\w
)这里只是消耗之初+最终从空间字的字符。这样,通过使用单词边界,模式只能找到完整的单词并且只能找到一次。 (并且几个不同数目的空格在左边不是相同的单词)
你是指什么意思*任何*? 1或更多('+')或0或更多('*')?此外,这些项目是重叠的。预期的比赛是什么? –
你期望'['tex1','text2','taxw']'? –
'\ s *'匹配*零*或更多空格,而不是*一个*或更多。 – NPE