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

3
我希望找到不匹配特定字符序列的字符串。例如:
像这样的东西
REGEX = r'[^XY]*'

我想查找除了相邻的X和Y之外,任意数量字符的字符串...上面的正则表达式无法工作,因为它分别阻止了X和Y。


我对 Python 的正则表达式不是很了解,但你的应该能用。或者尝试用“+”替换“*”。 - El Ronnoco
1
我刚刚在http://nmichaels.org/regular.py上检查了一下,看起来它运行良好。你能给我们一个字符串来测试吗? - nmichaels
我也不知道你所说的分别阻止X和Y是什么意思。这个正则表达式将忽略X和Y... - El Ronnoco
你能不能只匹配那些包含 XY 的字符串,然后对不包含的字符串进行任何你想要的操作? - Thomas K
你的问题含糊不清。你是想要判断字符串中是否不包含“XY”吗? - John Machin
2个回答

2
如何呢:
if "XY" not in s:
   print "matched"
else
   print "not matched"

还是你需要将其包含在某个更长的正则表达式中?那么也许你需要一个负向前瞻表达式:

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

编辑:修正了拼写错误


我认为你在第一行多了一个“不”。 - Thomas K

1

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

^(?!.*XY).*$

前瞻表达式尝试在字符串中的任何位置匹配XY序列。这是一个负面前瞻,因此如果找到一个,匹配尝试失败。否则,.*继续消耗整个字符串。

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

这个正则表达式会重复匹配任何字符 (.),但只有在前瞻确认该字符不是 XY 序列的开头后才会匹配。

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

重复匹配除了X之外的一个或多个任意字符,或者如果X后面不跟着Y,则匹配X

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接