python正则表达式从匹配字符串中排除

时间:2011-10-03 11:27:21

标签: python regex

我有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

我会接受eyquem关于re.search的建议('没有\ s +传递|传递:?\ s +([A-Z] +)')

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这里使用match not OK。对于这种情况,最好使用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)

,但不幸的是当前版本的正则表达式引擎不支持无限外观。

答案 2 :(得分:1)

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