正则表达式查找不被字符串2跟随的字符串1

2 投票
1 回答
1181 浏览
提问于 2025-04-16 00:57

如何构建一个正则表达式搜索模式,以找到字符串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中,findrfind 分别返回子串出现的最小和最大索引。

所以如果你想确保 string1 出现,但后面从来没有 string2,并且如果字符串没有找到,两个方法都会返回 -1,那么你可以测试这个条件:

string.rfind(s, string2) < string.find(s, string1)

这个方法比较了 string1 最左边的出现和 string2 最右边的出现。

  • 如果都没有出现,两个都是 -1,结果是 false
  • 如果 string1 出现,但 string2 没有,那么结果是 true,这正是我们想要的
  • 如果两个都出现,那么最右边的 string2 必须在最左边的 string1 的左边
    • 也就是说,string1 后面从来没有 string2

API链接

撰写回答