正则表达式以避免给定的一组子串

时间:2013-10-10 20:34:47

标签: regex

我正在寻找一个可以匹配不包含给定子串集的所有内容的单个正则表达式。

例如,一个正则表达式将匹配不包含子字符串“abc”,“def”,ghi“

的所有内容

在此示例中,正则表达式将匹配“student”,“apple”和“maria”,但不匹配“definition”,“ghint”或“abc123”

提前致谢

3 个答案:

答案 0 :(得分:1)

这就是你使用negative lookahead assertion

^(?!.*(abc|def|ghi))
只要输入字符串不包含任何“坏”字,

就会匹配。

请注意,前瞻断言本身与任何内容都不匹配,因此匹配结果(在成功匹配的情况下)将是一个空字符串。

在Python中:

>>> regex =  re.compile("^(?!.*(abc|def|ghi))")
>>> [bool(regex.match(s)) for s in ("student", "apple", "maria",
...                                 "definition", "ghint", "abc123")]
[True, True, True, False, False, False]

答案 1 :(得分:1)

您可以使用前瞻:

^(?!.*?(?:abc|def|ghi)).*$
  • (?!...)被称为negative lookahead
  • (?:...)被称为非捕获组。

Regex Reference

答案 2 :(得分:0)

如果你有一个包含“禁止”字样的字符串,如下面的“

  

学生苹果玛丽亚定义ghint abc123 righit

你只想知道字符串是否包含它们,你可以使用:

.*?(?!def|abc|ghi)

这将为您提供4场比赛

  • d
  • g
  • a

这是禁词的第一个字母(* def * inition,* ghi * nt,* abc * 123,ri * ghi * t)

如果在您的字符串中找不到匹配项,则没有“禁止”字样。

你也可以使用regex.replace:

\w*(abc|def|ghi)\w*

用“”替换你的“禁止”子串,允许你保留所有非禁止的子串。