[英]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_123
的label
组没有为repeat_num
。
和我期待的第二串s2
匹配abc_123
为label
的群体和“1” repeat_num
。
在两种情况下,实际结果均以abc
停止。
似乎部分是由于[^_]
位所致,该位匹配“除下划线外的任何字符”。
我无法立即找到一种能够正确捕获这些令牌的解决方案; 我强烈建议您使用RegExr来处理您的正则表达式,以便弄清楚如何正确匹配各个部分。
您的模式与abc
和123
输入字符串之间的_
不匹配。 您需要修改第一个捕获组才能处理这些捕获组。
但是直接翻译可能会遇到困难,因为将最后一个_r1
块与正常的额外块(如_123
区分开来有点困难。 我认为下面的模式可以正确执行此操作,但是您应该仔细检查它是否始终符合您的期望:
(?P<label>[^_]+(?:_[^_]+)*?)(?:_r(?P<repeat_num>\d+))?
如果您始终在文本的第一部分中至少需要两个带下划线的分隔成组(例如abc_123
,但绝不只是abc
或123
本身),则应替换*?
用+?
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.