我有这两个字符串:
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的问题?因为.
包含了所有内容!
答案 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)
>>>
字符串,它就会停止匹配。
{{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