首页 > 解决方案 > 正则表达式模式需要在不同位置的两个特定字符串中的任何一个

问题描述

我有一个字符串,它可以在较大的文本正文中以以下两种格式中的任何一种存在:

OptionalSpecificString1 1234
1234 OptionalSpecificString2

这里的文字都是占位符。我正在寻找一个在特定可选字符串之前或之后的数字字符串。两个可选的特定字符串之一将始终存在,并且是定位和捕获感兴趣的数字字符串所必需的。是否存在可以捕获此行为的单个正则表达式模式?

就像是:

(?:OptionalSpecificString1)? (\d+) (?:OptionalSpecificString2)?

几乎可以做到,但不需要两个可选字符串之一存在,因此它最终可能匹配文本正文中的任何其他数字字符串。我知道我可以做类似的事情:

(OptionalSpecificString1 (\d+)|(\d+) OptionSpecificString2)

但我想我只是想知道是否有更优雅的东西。我正在使用 Pythonre模块执行此操作,因此当我可以为同一模式表达单个捕获组时,代码也可以更简单一些。

标签: pythonregex

解决方案


如果 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)

推荐阅读