簡體   English   中英

如何匹配除某些字符以外的所有東西? 正則表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM