通过扩展现有的 Regex 在匹配中进行匹配

Matching within matches by extending an existing Regex

我正在尝试查看是否可以通过在匹配项中添加或附加另一个正则表达式来匹配现有的任意正则表达式。

举个例子:

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

cat
car
bat

我想添加到这个正则表达式中,只输出以 'ca'、

开头的匹配项
cat
car

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

^ca[tr]

或 运行 原始正则表达式,然后是第二个正则表达式。我将原始正则表达式作为 python 中的参数,但想通过添加附加代码来 'prefilter' 匹配。

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

我尝试过的事情:

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

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

初始查询的一个更实际的示例可能是 [a-z]{4} 但如果我创建 (?<=^ca([a-z]{4})) 它匹配以 ca 开头的 6 个字母字符串, 不是 4 个字母。

感谢任何解决方案 and/or 意见。

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

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

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

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

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

查看@Nick 的评论。

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