[英]How to match every thing except some character ? regex
我有以下兩個字符串:
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的value1的問題? 因為.
包括每件事!
如下使用否定的超前斷言。 下面的正則表達式僅在從開頭開始恰好有兩個word1
字符串開頭時才捕獲字符串value1
。
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)
>>>
您可以使用下面的函數,即使用re.findall
和積極查找落后於正則表達式:
>>> 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.