我目前有以下正则表达式:
/(_|[a-z]|[A-Z])(_|[a-z]|[A-Z]|[0-9])*/
我希望表达式不与“ PI”匹配,但是我没有这样做。 为了澄清,我希望以下内容有效: _PI,abcPI,PIpipipi 我只是不想接受PI本身。
答案 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_]*)?)$/