Python Regex中的Regex(?J)模式修饰符或用于不同模式的命名捕获组的等效功能

t40tm48m  于 2023-03-09  发布在  Python
关注(0)|答案(1)|浏览(100)

我尝试使用一个命名的捕获组从两个不同的模式序列中进行捕获。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-xyzxyz-CAPTUREME,但我无法使用lookarounds重现上面链接的第二篇堆栈溢出文章中的示例。每次尝试复制第二篇堆栈溢出文章都与我的字符串不匹配,差异太多,我无法拼凑出发生了什么。

r'abc-(?P<cap>(xyz-)\w+|\w+(-xyz))-abcdef'

https://regex101.com/r/NeWrDe/1

zpgglvta

zpgglvta1#

查看第二篇文章,您可以将模式编写为:

(?P<cap>(?<=abc-xyz-)\w+|\w+(?=-xyz-abcdef))
    • 说明**
  • (?P<cap>命名组 * 上限 *
  • (?<=abc-xyz-)\w+匹配1+个单词字符,向左Assertabc-xyz-
  • |
  • \w+(?=-xyz-abcdef)匹配1个以上单词字符,在右侧Assert-xyz-abcdef
  • )闭合组 * 上限 *

Regex demo
Python中的另一个选项是使用条件和捕获组:

abc-(xyz-)?(?P<cap>\w+)-(?(1)|xyz-)abcdef
    • 说明**
  • abc-(xyz-)?匹配abc-,并可选择捕获组1中的xyz-
  • (?P<cap>\w+)命名组 * cap *,匹配1个以上单词字符
  • -逐字匹配
  • (?(1)|xyz-)如果组1不存在,则匹配xyz-
  • abcdef逐字匹配

Regex demo

相关问题