python - 匹配所有内容的正则表达式,直到找到一个单词
问题描述
我有一段重复多次的文本。在这里,您有该文本的示例:
这个想法是有一个包含三个组的正则表达式,并对任何匹配与文本重复此操作。这里有一个可能匹配的例子:
group1 = HORIZON-CL5-2021-D1-01 group2 (Opening) = 15 Apr 2021 group3 (Deadlines(s)) = 07 Sep 2021 group1 = HORIZON-CL5-2022-D1-01-two-stage group2 (Opening) = 04 Nov 2021 group3 (Deadlines(s)) = 15 Feb 2022 (First Stage), 07 Sep 2022 (Second Stage)
我正在尝试使用这个正则表达式:
\n(HORIZON-\S+-[A-Z]{1}\d{1}-\d{2}).*?^Opening
它几乎可以工作。我需要在正则表达式中多说两件事:
- 在某些情况下,在最后一个 HORIZON... 之后可能会出现一些文本,例如第二种情况:
HORIZON-CL5-2022-D1-01-两级
- 我需要说“抓住一切”,直到“Opening:”这个词出现在一行的开头。我以为是用这部分表达式来做这件事,
.*?^Opening
但似乎不正确。
我该如何解决这个问题?
解决方案
要获得第-two-stage
1 组,您可以将匹配的 0+ 个非空白字符添加\S*
到现有组。
您不需要s
修饰符来使点匹配换行符。相反,您可以使用负前瞻匹配所有不以Opening 开头的行,然后匹配Opening并在捕获组中捕获日期和截止日期部分。
请注意,您可以省略{1}
^(HORIZON-\S+-[A-Z]\d-\d{2}\S*)(?:\r?\n(?!Opening\b).*)*\r?\nOpening: (.+)\r?\nDeadline\(s\): (.+)
您可以根据需要使以日期开头的组为特定部分,.+
广泛匹配也是如此。
例如
^(HORIZON-\S+-[A-Z]\d-\d{2}\S*)(?:\r?\n(?!Opening\b).*)*\r?\nOpening: (\d{2} [A-Z][a-z]{2} \d{4})\r?\nDeadline\(s\): (\d{2} [A-Z][a-z]{2} \d{4}.*)
推荐阅读
- java - 无法创建 Java 虚拟机,Eclipse 中发生了致命异常
- android - FloatingActionButton 在 xml 布局中没有改变
- python - IndexError:字符串索引超出范围在 odoo-14.0 中显示
- c# - C# 生成的招摇客户端不使用日期时间格式
- angular - firestore 文档中的未定义字段
- python - 最近更改之前的 FastText 版本
- azure - 使用 Azure 免费试用,当我不是订阅所有者时无法创建资源
- oracle - 某些 Windows 用户无法使用 SQL Developer 看到 Oracle 中的某些表
- sql - 转换为样式为 114 的 varchar 时,datetime 和 datetime2(3) 数据类型之间的输出格式差异
- javascript - 如何在新选项卡中打开页面而不在 vueJs 中单击按钮