正则表达式查找不被字符串2跟随的字符串1
如何构建一个正则表达式搜索模式,以找到字符串1,但不紧跟着字符串2(无论是立即跟随还是不跟随)?
比如,如果字符串1是"MAN",字符串2是"PN",那么搜索结果可能是:
"M": Not found
"MA": Not found
"MAN": Found
"BLAH_MAN_BLEH": Found
"MAN_PN": Not found
"BLAH_MAN_BLEH_PN": Not found
"BLAH_MAN_BLEH_PN_MAN": Not found
理想情况下,这应该是一个一行的搜索,而不是再进行一次对字符串2的搜索。
附注:使用的编程语言是Python。
1 个回答
3
看起来你可以使用 MAN(?!.*PN)
。这个表达式会匹配 MAN
,并且通过一种叫做负向前瞻的方式,确保后面没有 PN
(在rubular.com上可以看到)。
比如说,对于 MAN_PN_MAN_BLEH
,上面的模式会找到第二个 MAN
,因为它后面没有 PN
。如果你想检查整个字符串,确保里面没有 MAN.*PN
,那么你可以使用类似 ^(?!.*MAN.*PN).*MAN.*$
的表达式(在rubular.com上可以看到)。
参考资料
相关问题
非正则表达式的选项
如果要精确匹配字符串,可以检查子串出现的位置。
在Python中,find
和 rfind
分别返回子串出现的最小和最大索引。
所以如果你想确保 string1
出现,但后面从来没有 string2
,并且如果字符串没有找到,两个方法都会返回 -1
,那么你可以测试这个条件:
string.rfind(s, string2) < string.find(s, string1)
这个方法比较了 string1
最左边的出现和 string2
最右边的出现。
- 如果都没有出现,两个都是
-1
,结果是false
- 如果
string1
出现,但string2
没有,那么结果是true
,这正是我们想要的 - 如果两个都出现,那么最右边的
string2
必须在最左边的string1
的左边- 也就是说,
string1
后面从来没有string2
- 也就是说,