首页 > 解决方案 > 使用 Regex 搜索字符串,除非它首先找到另一个字符串

问题描述

您好,我正在尝试使用正则表达式在降价文件中搜索日期,并且只有在找到另一个日期之前找到特定字符串的实例时才获得匹配项。

这就是我现在所拥有的,它绝对行不通。 (\d{2}\/\d{2}\/\d{2})(string)?(^(\d{2}\/\d{2}\/\d{2}))

所以在这种情况下,它会抛出一个匹配,因为字符串在下一个日期之前:

01/20/20

string

01/21/20

在这里它不应该匹配,因为字符串在下一个日期之后:

01/20/20

this isn't the phrase you're looking for

01/21/20

string

对此的任何帮助将不胜感激。

标签: pythonregex

解决方案


这里的一种方法是使用缓和点来确保正则表达式引擎在尝试查找开始日期之后的字符串时不会越过结束日期。例如:

inp = """01/20/20

string                  # <-- this is matched

01/21/20

01/20/20

01/21/20

string"""               # <-- this is not matched

matches = re.findall(r'01/20/20(?:(?!\b01/21/20\b).)*?(\bstring\b).*?\b01/21/20\b', inp, flags=re.DOTALL)
print(matches)

这仅打印string一次,该匹配是第一次出现,合法地位于开始日期和结束日期之间。


推荐阅读