快速Python正则表达式问题:匹配否定字符集
我想找一些不符合特定字符顺序的字符串。举个例子:
像这样
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)..."
编辑:修正了一个错别字