regex 匹配字符串中多个选项中的第一个子字符串选项

jw5wzhpr  于 2023-03-13  发布在  其他
关注(0)|答案(2)|浏览(144)

我有绳子

  • string = 'fail alm alarm'
  • 我想匹配的一组子字符串substrings=[norm,alm,fail]

但是,我希望normalm具有比fail更高的匹配优先级。
我写了pattern=r'norm|alm|fail'
考虑到由于normalm出现在fail之前,所以它们将被给予优先级
re.search('norm|alm|fail', 'fail alm alarm')返回
<re.Match object; span=(20, 24), match='fail'>
但是我希望它返回alm
提前感谢您的帮助

wribegjk

wribegjk1#

正则表达式中的顺序只影响正则表达式引擎尝试在 current 位置查找匹配项的顺序。
为了达到你的目标,你需要向前看,并检查是否有“规范”或“alm”当走向“失败”。

norm|alm|fail(?!.*(?:norm|alm))
nx7onnlm

nx7onnlm2#

可以使用re.findall,然后逐个检查字符串是否存在:

import re

string = 'fail alm alarm'
substrings_ordered_by_importance = ["norm", "alm", "fail"]
pattern = "|".join(substrings_ordered_by_importance)

matches = re.findall(pattern, string) # >>> ['fail', 'alm']
result = None
for substring in substrings_ordered_by_importance:
    if substring in matches:
        result = substring
        break

result # >>> "alm"

相关问题