2017-09-03 118 views
1
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 '不具有在开始空间。
我试图找出发现

  1. 的空间任何没有在一开始的模式
  2. 那么任何数目的字符
  3. 然后字母“X”
  4. 那么任何字符数
  5. ,最后没有任何空格
+0

你是指什么意思*任何*? 1或更多('+')或0或更多('*')?此外,这些项目是重叠的。预期的比赛是什么? –

+0

你期望'['tex1','text2','taxw']'? –

+0

'\ s *'匹配*零*或更多空格,而不是*一个*或更多。 – NPE

回答

1

注意'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 '] 

Python demo

(?=(\s*))是一种非消耗正前瞻那不会移动正则表达式索引,因此它可以在之后的匹配之前匹配前面的空格。

0

我觉得这样才能正则表达式的帮助:

\s+\w*x\w*(?=\s+|$) 

[Regex Demo]

然后打印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 
0

为了配合重叠的字符串,你可以使用由解决方法把图案的前瞻内的使用捕获组:

re.findall(r'(?=(\s*\b\w*x\w*\s*))\s*.', x) 

当定义了一个捕获组,re.findall只返回的内容捕获组在其结果列表中。

\s*.(即也可以写\s*\w这里只是消耗之初+最终从空间字的字符。这样,通过使用单词边界,模式只能找到完整的单词并且只能找到一次。 (并且几个不同数目的空格在左边不是相同的单词)