繁体   English   中英

我应该匹配某个模式重复项和一个可选模式的Python正则表达式在做什么?

[英]What am I doing wrong with this Python regex that is supposed to match repeats of a pattern, followed by an optional pattern?

这是我正在尝试的:

import re

r = re.compile(r'(?P<label>(?:[^_]+)+)(_r(?P<repeat_num>\d+))?')

def main():
    s1 = 'abc_123'
    s2 = 'abc_123_r1'

    m1 = r.match(s1)
    m2 = r.match(s2)

    print(m1.groups())
    print(m2.groups())

if __name__ == "__main__":
    main()

我期待第一串s1匹配abc_123label组没有为repeat_num

和我期待的第二串s2匹配abc_123label的群体和“1” repeat_num

在两种情况下,实际结果均以abc停止。

似乎部分是由于[^_]位所致,该位匹配“除下划线外的任何字符”。

我无法立即找到一种能够正确捕获这些令牌的解决方案; 我强烈建议您使用RegExr来处理您的正则表达式,以便弄清楚如何正确匹配各个部分。

您的模式与abc123输入字符串之间的_不匹配。 您需要修改第一个捕获组才能处理这些捕获组。

但是直接翻译可能会遇到困难,因为将最后一个_r1块与正常的额外块(如_123区分开来有点困难。 我认为下面的模式可以正确执行此操作,但是您应该仔细检查它是否始终符合您的期望:

(?P<label>[^_]+(?:_[^_]+)*?)(?:_r(?P<repeat_num>\d+))?

如果您始终在文本的第一部分中至少需要两个带下划线的分隔成组(例如abc_123 ,但绝不只是abc123本身),则应替换*? +?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM