python - 使用 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
对此的任何帮助将不胜感激。
解决方案
这里的一种方法是使用缓和点来确保正则表达式引擎在尝试查找开始日期之后的字符串时不会越过结束日期。例如:
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
一次,该匹配是第一次出现,合法地位于开始日期和结束日期之间。
推荐阅读
- docker - 为什么简单的 Dockerfile 会给出“权限被拒绝”?
- javascript - 如何在 Laravel Blade 文件中初始化()一个 JS
- node.js - Prisma:在突变解析器中使用计数
- django - 当我没有时,Django 认为我有一个 id 字段
- algorithm - 了解改进的 Baugh-Wooley 乘法算法
- java - 我有一个用于 Java 开发的 Eclipse IDE。我如何为 JSP 使用相同的 IDE?
- c# - 用户登录时如何更改声明
- ruby-on-rails - 使用 ransack for Rails 应用程序材料下拉选择视图
- maven - 当来自另一个 JVM 模块的源文件运行时,防止非 src 代码模块运行 maven 构建周期
- javascript - 如何访问 ReactJS 中的 :root 元素以编辑 CSS 变量?