你如何与re.findall()重叠匹配?

时间:2017-09-03 16:23:28

标签: python regex python-3.x

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)

我的输出为

[' tex1 ', 'text2 ', 'taxw ']   

其中只有tex1符合上述条件,而'text2 ', 'taxw '在开头没有空格。
我试图找出一个找到

的模式
  1. 开头没有任何空格
  2. 然后任意数量的字符
  3. 然后写'x'
  4. 然后任何字符
  5. 最后没有任何空格

3 个答案:

答案 0 :(得分:1)

请注意,'tex1 '' text2 '' taxw '重叠,text2taxw之前的空格在前一次迭代期间由模式匹配和使用

您可以做的是将最终的\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*))是一个非消费的正向前瞻,它不会移动正则表达式索引,因此,它可以匹配前面的空格,然后再匹配。

答案 1 :(得分: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

答案 2 :(得分:0)

要匹配重叠的字符串,您可以使用包含将模式放在前瞻中的解决方法来使用捕获组:

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

定义捕获组后,re.findall仅返回结果列表中捕获组的内容。

\s*. (也可以写成\s*\w仅用于消费开头的最终空格+来自单词的字符。这样,通过使用单词边界,模式只能找到完整的单词而且只能找到一次。 (左边的空格数不同,不是同一个词)