2011-10-03 208 views
1

我有3個字符串蟒蛇正則表達式的匹配字符串排除

a ="keep the your pass ABCDEFG other text" 
b ="your pass: TESTVALUE other text" 
c ="no pass required other text" 

我想傳球后獲得資本價值,這樣

re.match(r'.*\spass:?\s([a-zA-Z]+).*',a,re.I).group(1) 
re.match(r'.*\spass:?\s([a-zA-Z]+).*',b,re.I).group(1) 

,但我要排除「不通過」,這是我不想重新匹配到C字符串,我該怎麼做?


解決方案:由於eyquem和ovgolovin

我將採取re.search的eyquem的建議( '無\ S +通過|傳:\ S +([AZ] +)?')

回答

3
import re 

for x in ("keep the your pass ABCDEFG other text", 
      "your pass: TESTVALUE other text", 
      "no pass required other text"): 
    print re.search('no\s+pass|pass:?\s+([A-Z]+)',x).group(1) 
A-Z]+)' 

結果

ABCDEFG 
TESTVALUE 
None 
+0

不錯。我希望使用re.findall來做類似的事情,但是它不使用group(x)。人力資源管理。 – kiminoa

1

這裏是not OK在這裏使用match。對於這種情況,最好使用search

re.search(r'(?<!no\s)pass:?\s+([A-Z]+)',a).group(1) 

這將是更好的把它寫這種方式:

re.search(r'(?<!no\s*)pass:?\s+([A-Z]+)',a).group(1) 

,但可惜的正則表達式引擎的當前版本不支持無限lookbehinds。

+0

是的,re.search解決問題的完美 – user976557

+0

@ user976557請閱讀爲什麼它是最好使用'search',不'match'(我提供的鏈接)。 – ovgolovin

1

解決方法是首先篩選不包含'不通過'的所有內容,然後搜索通過。做兩個步驟可能看起來有點沉重,但這樣做會避免很多問題。你正試圖同時解決兩個問題(顯然你正在努力做到這一點),所以把這兩個問題分開。