【问题标题】:How do I match the correct strings while keeping capture groups the same?如何在保持捕获组相同的同时匹配正确的字符串?
【发布时间】:2022-01-20 00:40:22
【问题描述】:

我从正则表达式开始:^(S?g?[mfds]|S?G*g[msdf])$,然后将其转换为:^(S?)(G*)(g?)(m|s|d|f|)$ 将捕获组分成 (S, G, g, m/f/d/s)

这是我应该匹配和不应该匹配的链接:https://regex101.com/r/q8b7zJ/1

我尝试通过在第二个捕获组中添加 (g?|G*g) 来解决此问题,以防止 Gm 匹配,但是,我的捕获组最终变为 (S, Gg, '', msdf)

如何在保持捕获组相同的同时匹配正确的字符串(S, G, g, m/s/d/f)

【问题讨论】:

  • 如果你不使用 PyPi 正则表达式库,你所能做的就是使用 ^(S?)(?:(g?)|(G*)(g))([mfds])$ 然后检查第 3 组和第 4 组或第 2 组是否匹配。

标签: python regex


【解决方案1】:

为防止Gm 匹配,您可以使用否定的前瞻(?!G[mfds]) 来排除G 后跟m f d d 中的任何一个的匹配项

import re

strings = [
    "m",
    "gf",
    "Ggm",
    "GGgf",
    "Ss",
    "SGgs",
    "mf",
    "Gm",
    "SSm",
    "GSm"
]

pattern = r"^(S?)(?!G[mfds])(G*)(g?)([mfds])$"
for s in strings:
    m = re.match(pattern, s)
    if m:
        print(m.groups())

输出

('', '', '', 'm')
('', '', 'g', 'f')
('', 'G', 'g', 'm')
('', 'GG', 'g', 'f')
('S', '', '', 's')
('S', 'G', 'g', 's')

查看regex demoPython demo

【讨论】:

    猜你喜欢
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    相关资源
    最近更新 更多