快速Python正则表达式问题:匹配否定字符集

3 投票
2 回答
2968 浏览
提问于 2025-04-16 10:41

我想找一些不符合特定字符顺序的字符串。举个例子:

像这样

REGEX = r'[^XY]*'

我想找那些包含任意字符,但不允许有X和Y紧挨在一起的字符串……上面的正则表达式不行,因为它把X和Y分别给挡住了。

2 个回答

1

有几种方法可以做到这一点。

^(?!.*XY).*$

这个“前瞻”表达式试图在字符串中的任何地方找到一个XY的组合。它是一个前瞻,所以如果找到了这个组合,匹配就会失败。否则,.*就会继续匹配并消耗整个字符串。

^(?:(?!XY).)*$

这个表达式会不断匹配任何字符(.),但只有在前瞻确认这个字符不是XY组合的开头之后才会进行匹配。

^(?:[^X]+|X(?!Y))*$

这个表达式会不断匹配一个或多个字符,但不能是X,或者是X但后面不能跟Y

对于前两个正则表达式,如果源字符串中可能有换行符,你需要使用DOT_ALL修饰符。而第三个表达式不需要这个,因为它使用了一个否定字符类 - [^X] - 而不是点号。

2

这样怎么样:

if "XY" not in s:
   print "matched"
else
   print "not matched"

还是说这是要放在某个更长的正则表达式里?那你可能需要用到一个负向前瞻表达式:

REGEXP="...(?!XY)..."

编辑:修正了一个错别字

撰写回答