2011-10-03 167 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

解决方法是首先筛选不包含'不通过'的所有内容,然后搜索通过。做两个步骤可能看起来有点沉重,但这样做会避免很多问题。你正试图同时解决两个问题(显然你正在努力做到这一点),所以把这两个问题分开。