排除正则表达式中的字符串

时间:2019-02-22 21:15:34

标签: python regex

我目前有以下正则表达式:

/(_|[a-z]|[A-Z])(_|[a-z]|[A-Z]|[0-9])*/

我希望表达式不与“ PI”匹配,但是我没有这样做。 为了澄清,我希望以下内容有效: _PI,abcPI,PIpipipi 我只是不想接受PI本身。

3 个答案:

答案 0 :(得分:2)

在开始使用该解决方案之前,请先查看一下您的正则表达式:交替组内单个范围的字符类是一种编写正则表达式模式的低效方式。您可以将这些([A-Z]|[0-9]|_)+合并到[A-Z0-9_]+中。

解决方案可能是一个单词边界,后面有一个负前瞻:

r"\b(?!PI\b)[_a-zA-Z][_a-zA-Z0-9]*"

请参见regex demo。您可以将[a-zA-Z0-9_]替换为\w

re.compile(r"\b(?!PI\b)[_a-zA-Z]\w*")          # In Python 2.x, re.UNICODE is not enabled by default
re.compile(r"\b(?!PI\b)[_a-zA-Z]\w*", re.A)    # In Python 3.x, make \w match ASCII only

详细信息

  • \b-单词边界
  • (?!PI\b)-紧靠右侧,整个单词不可能PI
  • [_a-zA-Z]-ASCII字母或_
  • [_a-zA-Z0-9]*-0个或多个下划线,ASCII字母或数字。

答案 1 :(得分:0)

提交另一个答案: ^(((?!PI).)*)$|^.*(PI).+$|^.+(PI).*$

我使用OR |将其分为3种情况:

1)匹配完全不包含PI的字符串。

^(((?!PI).)*)$

2)匹配其中包含PI但后面至少包含一个字符,并且可选地包含前面任何字符的字符串。

^.*(PI).+$

3)匹配其中包含PI但在其前面至少有一个字符以及在其后有任意字符的字符串。

^.+(PI).*$

这里是测试用例: https://regex101.com/r/7rzqpe/3

如果发现缺少边缘情况,请发表评论。

答案 2 :(得分:0)

不太好,但是我还是会添加它以增加多样性:

/^([A-OQ-Za-z_][A-Za-z0-9_]*|P([A-HJ-Za-z0-9_][A-Za-z0-9_]*)?)$/