【问题标题】:Matching within matches by extending an existing Regex通过扩展现有的正则表达式在匹配中匹配
【发布时间】:2019-11-22 10:19:15
【问题描述】:

我正在尝试通过预先或附加另一个正则表达式来扩展现有的任意正则表达式以匹配匹配项。

举个例子:

原来的正则表达式是cat|car|bat,所以匹配的输出是

cat
car
bat

我想添加到这个正则表达式并且只输出以“ca”开头的匹配项,

cat
car

我特别不想解释整个正则表达式,这可能是一个相当长的操作,然后更改其内部内容以匹配生成输出,如下所示:

^ca[tr]

或运行原始正则表达式,然后在结果上运行第二个。我将原始正则表达式作为 python 中的参数,但想通过添加附加代码来“预过滤”匹配项。

这可能是对正则表达式的轻微滥用,但如果可能的话,我仍然感兴趣。我已经尝试了我所知道的子组和以下示例,但它们并没有给我我需要的东西。

我尝试过的事情:

^ca(cat|car|bat)
(?<=ca(cat|car|bat))
(?<=^ca(cat|car|bat))

这可能是不可能的,但我对任何正则表达式大师的想法感兴趣。如果初始输出的长度已知,是否有某种方法可以在位置上执行此操作,我也很感兴趣。

初始查询的一个更实际的例子可能是 [a-z]{4} 但如果我创建 (?

感谢您提供任何解决方案和/或意见。

编辑:请参阅下面的解决方案,包括@Nick 的贡献。我用 (exrex) 测试的工具似乎有一个小错误,按照给出的示例,它会创建 6 个字符长的匹配项。

【问题讨论】:

    标签: regex filter grouping extending


    【解决方案1】:

    你所尝试的并不遥远,只是你不需要 lookbehind,而是需要 lookahead 断言,并且括号放错了位置。正确的做法是:将原始模式放在括号中,并在前面加上(?=ca)

    (?=ca)(cat|car|bat)
    (?=ca)([a-z]{4})
    

    在第二个示例中(没有| 替代),不需要在原始模式周围加上括号。

    【讨论】:

    • 谢谢。看起来它与我需要的很接近,但例如第二个解决方案导致 cabcdefg 匹配,但我只在匹配 [a-z]{4} 的字符串中寻找结果,即 4 个字符长。
    • 您需要在正则表达式 regex101.com/r/ZFMu16/1 的开头和结尾添加锚点(^$
    • 谢谢尼克。看起来我们是同时到达那里的,但是。我会将此标记为正确答案。
    【解决方案2】:

    好的,感谢@Armali,我得出结论 (?=ca)(^[a-z]{4}$) 有效(请参阅https://regexr.com/3f4vo)。但是,我正在尝试使用出色的 exrex 工具来尝试生成匹配字符串,并且它生成的匹配长度为 6 个字符而不是 4 个。这可能是 exrex 而不是正则表达式的限制,这似乎适用于其他案例。

    查看@Nick 的评论。

    为此,我还在 exrex GitHub 上提出了一个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-05
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      相关资源
      最近更新 更多