我尝试使用一个命名的捕获组从两个不同的模式序列中进行捕获。This SO question使用模式修饰符(?J)
解决了PCRE中的问题,而this SO question解决了Python中的一个相关问题,我还没有成功地将其应用到我的用例中。
测试字符串示例:
abc-CAPTUREME-xyz-abcdef
abc-xyz-CAPTUREME-abcdef
预期输出:
CAPTUREME
CAPTUREME
CAPTUREME
出现在xyz
序列的左边或右边。我最初失败的正则表达式尝试如下所示:
r'abc-(xyz-(?P<cap>\w+)|(?P<cap>\w+)-xyz)-abcdef'
但是在Python正则表达式中会产生错误(?P<cap> A subpattern name must be unique)
,并且Python不支持(?J)
修饰符,在上面的第一个答案中使用了这个修饰符来解决这个问题。
使用单个捕获组,我可以捕获CAPTUREME-xyz
或xyz-CAPTUREME
,但我无法使用lookarounds重现上面链接的第二篇堆栈溢出文章中的示例。每次尝试复制第二篇堆栈溢出文章都与我的字符串不匹配,差异太多,我无法拼凑出发生了什么。
r'abc-(?P<cap>(xyz-)\w+|\w+(-xyz))-abcdef'
1条答案
按热度按时间zpgglvta1#
查看第二篇文章,您可以将模式编写为:
(?P<cap>
命名组 * 上限 *(?<=abc-xyz-)\w+
匹配1+个单词字符,向左Assertabc-xyz-|
或\w+(?=-xyz-abcdef)
匹配1个以上单词字符,在右侧Assert-xyz-abcdef)
闭合组 * 上限 *Regex demo
Python中的另一个选项是使用条件和捕获组:
abc-(xyz-)?
匹配abc-
,并可选择捕获组1中的xyz-
(?P<cap>\w+)
命名组 * cap *,匹配1个以上单词字符-
逐字匹配(?(1)|xyz-)
如果组1不存在,则匹配xyz-
abcdef
逐字匹配Regex demo