Python正则表达式排除匹配字符串

1 投票
3 回答
7468 浏览
提问于 2025-04-17 03:34

我有三个字符串

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('no\s+pass|pass:?\s+([A-Z]+)')

3 个回答

1

一个解决办法是,先过滤掉所有不包含“未通过”的内容,然后再去找“通过”的内容。虽然这样分成两个步骤看起来有点麻烦,但这样做可以避免很多问题。你现在试图同时解决两个问题(而且看起来你有点困难),所以不如把这两个问题分开来处理。

1

在这里使用 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)

不过很遗憾,目前的正则表达式引擎不支持无限的回顾。

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

撰写回答