正则表达式匹配除给定正则表达式之外的所

时间:2009-11-23 07:17:04

标签: python regex

我试图找出一个正则表达式,它匹配任何不以mpeg开头的字符串。对此的一般化是匹配任何不以给定正则表达式开头的字符串。

我尝试了如下内容:

[^m][^p][^e][^g].* 

这个问题是它要求字符串中至少包含4个字符。我无法找到一种处理这种方法的好方法,也是一种以通用方式处理这种方法的通用方法。

我将在Python中使用它。

4 个答案:

答案 0 :(得分:27)

^(?!mpeg).*

这使用负前瞻来匹配开头与mpeg不匹配的字符串。从本质上讲,它要求“字符串开头的位置不能是一个位置,如果我们开始匹配正则表达式mpeg,我们就可以成功匹配” - 从而匹配任何不以mpeg开头的东西,而不是匹配任何事情。

但是,我对你正在使用它的上下文感到好奇 - 除了正则表达式之外可能还有其他选择,它可以更有效或更具可读性,例如......

if not inputstring.startswith("mpeg"):

答案 1 :(得分:9)

不要因为正则表达而失去理智。

if len(mystring) >=4 and mystring[:4]=="mpeg":
    print "do something"

或将startswith()与“not”关键字一起使用

if len(mystring)>=4 and not mystring.startswith("mpeg")

答案 2 :(得分:2)

尝试look-ahead assertion

(?!mpeg)^.*

或者,如果您只想使用否定类:

^(.{0,3}$|[^m]|m([^p]|p([^e]|e([^g])))).*$

答案 3 :(得分:0)

你的正则表达式与“npeg”不符,我想你需要拿出来 ^($|[^m]|m($|[^p]|p($|[^e]|e($|[^g])))),这太可怕了。 另一种选择是^(.{0,3}$|[^m]|.[^p]|..[^e]|...[^g]) 这只是稍好一点。

所以我认为你应该使用Dav和Gumbo建议的前瞻性断言: - )