python - 正则表达式模式需要在不同位置的两个特定字符串中的任何一个
问题描述
我有一个字符串,它可以在较大的文本正文中以以下两种格式中的任何一种存在:
OptionalSpecificString1 1234
1234 OptionalSpecificString2
这里的文字都是占位符。我正在寻找一个在特定可选字符串之前或之后的数字字符串。两个可选的特定字符串之一将始终存在,并且是定位和捕获感兴趣的数字字符串所必需的。是否存在可以捕获此行为的单个正则表达式模式?
就像是:
(?:OptionalSpecificString1)? (\d+) (?:OptionalSpecificString2)?
几乎可以做到,但不需要两个可选字符串之一存在,因此它最终可能匹配文本正文中的任何其他数字字符串。我知道我可以做类似的事情:
(OptionalSpecificString1 (\d+)|(\d+) OptionSpecificString2)
但我想我只是想知道是否有更优雅的东西。我正在使用 Pythonre
模块执行此操作,因此当我可以为同一模式表达单个捕获组时,代码也可以更简单一些。
解决方案
如果 Python 支持命名组重新定义,则解决方案可能是OptionalSpecificString1\s*(?P<numeric>\d+)|(?P<numeric>\d+)\s*OptionalSpecificString2
,只需制作两种不同的语法正则表达式替代方案。
因为它没有,您可以将您的数值捕获到不同的组中,无论是否命名,然后在 Python 代码中选择非空的,如下所示:
import re
text = r'''
OptionalSpecificString1 1234
An irrelevant line
5678 OptionalSpecificString2
Another irrelevant line
'''
pattern = r'OptionalSpecificString1\s*(?P<numeric1>\d+)|(?P<numeric2>\d+)\s*OptionalSpecificString2'
numerics = []
for match in re.finditer (pattern, text):
numerics.append (match.group ('numeric1') or match.group ('numeric2'))
print (numerics)
推荐阅读
- networking - 为什么无法从同一网络中的另一台电脑接收 rtp 流?
- ios - Xamarin.iOS:调用 ATTrackingManager.RequestTrackingAuthorization 时崩溃
- android - 单击主页按钮时如何释放应用程序
- pyspark - 附加模式下的 Spark 结构化流,每个时间窗口输出多行
- r - R:具有趋势和约束系数的聚合 Cobb-Douglas 生产函数估计
- c# - 在 UWP 中使用 System.Reflection.Emit(使用 .NET 本机工具链)
- javascript - 为什么即使我点击第二个笔记,它也只编辑第一个笔记?
- android - 我们可以在 kubernetes pod 中运行 android 操作系统吗?
- csv - 从 youtube 链接返回标题
- html - 根 div 反应宽度与视口宽度不同