如何匹配除了某些角色以外的所有东西?正则表达式

时间:2014-12-02 16:45:56

标签: python regex python-2.7 python-3.x

我有这两个字符串:

s2 = 开始 bla bla bla word1 bla bla bla word1 value1 word1 bla bla bla

s1 = 开始 bla bla bla word1 bla bla bla word1 bla bla bla word1 value1

我想检查s是否具有value1,但它应该在第二个word1之后。 所以s1应该返回value1,但是s2应该返回None,因为value1位于第三个word1之后。

我试过了:

re.search('start(.*?word1){2}\s+(value1)')

我的搜索返回s1和s2的值1的问题?因为.包含了所有内容!

2 个答案:

答案 0 :(得分:2)

使用如下所示的否定先行断言。只有当字符串value1之前恰好有两个word1字符串时,它才会捕获字符串r'start(?:(?:(?!word1).)*word1){2}(?:(?!word1).)*?(value1)'

(?:(?!word1).)*

word1会匹配任何字符,但不会匹配w零次或多次。也就是说,在匹配单个字符之前,正则表达式引擎会检查字符不是ord1后跟word1。如果没有,则只有正则表达式引擎匹配以下字符。在匹配每个字符之前进行此检查。一旦看到>>> import re >>> s2 = "start bla bla bla word1 bla bla bla word1 value1 word1 bla bla bla" >>> s1= "start bla bla bla word1 bla bla bla word1 bla bla bla word1 value1" >>> re.search(r'start(?:(?:(?!word1).)*word1){2}(?:(?!word1).)*?(value1)', s2) <_sre.SRE_Match object at 0x7f0bb60e9558> >>> re.search(r'start(?:(?:(?!word1).)*word1){2}(?:(?!word1).)*?(value1)', s2).group(1) 'value1' >>> re.search(r'start(?:(?:(?!word1).)*word1){2}(?:(?!word1).)*?(value1)', s1) >>> 字符串,它就会停止匹配。

DEMO

{{1}}

答案 1 :(得分:0)

您可以使用以下函数,在正则表达式中使用re.findall和正look-behind

>>> def find(val,s):
...  if re.findall(r'(?<=word1 )\w+',s)[1]==val:
...    return val
...  else :
...    return None
... 
>>> print find('value1',s1)
None
>>> print find('value1',s2)
value1