根据重复模式捕获整个重复字符串

时间:2019-02-15 10:45:28

标签: python regex

以下正则表达式同时匹配59-59-5959-59-59-59并仅输出59 目的是匹配四个唯一的数字,后跟-,最大数字为59。小于10的数字表示为00-09

print(re.match(r'(\b[0-5][0-9]-{1,4}\b)','59-59-59').groups())
--> output ('59-',)

我需要完全匹配59-59-59-59

的模式匹配

并且与59--59-5959-59-59-59-59不匹配

2 个答案:

答案 0 :(得分:3)

如果使用re.match,请尝试使用以下模式:

[0-5][0-9](?:-[0-5][0-9]){3}$

这句话的意思是匹配从0到5的初始数字,后跟任何第二个数字。然后,其后是带有相同规则的破折号和数字,该数量恰好是该数字的三倍。请注意,默认情况下,re.match锚定在开头,因此我们只需要结尾锚定$

代码:

print(re.match(r'([0-5][0-9](?:-[0-5][0-9]){3})$', '59-59-59-59').groups())

('59-59-59-59',)

如果您打算实际上连续四次匹配相同数字,请查看@Thefourthbird的答案。

如果要在较大的文本中找到这样的字符串,请考虑使用re.search。在这种情况下,请使用以下模式:

(?:^|(?<=\s))[0-5][0-9](?:-[0-5][0-9]){3}(?=\s|$)

请注意,我没有使用单词边界\b,而是在此处使用环视法来强制“单词”的结尾。这意味着上述模式将59-59-59-59-59之类的东西匹配。

答案 1 :(得分:3)

在您的模式中,此部分a { display: block; text-decoration: none; padding: 10px; font-weight: 600; color: #b2b4b8; transition-property: color, background; transition-duration: 0.3s; display: flex; align-items: center; } 匹配1-4连字符,因此-{1,4}将匹配。

如果所有匹配项都与59相同,则可以在第一个捕获组中使用backreference,并在前面加上连字符重复3次。

59--

您的代码可能如下:

\b([0-5][0-9])(?:-\1){3}\b

如果不应存在部分匹配项,则可以使用锚点来声明字符串的import re res = re.match(r'\b([0-5][0-9])(?:-\1){3}\b', '59-59-59-59') if res: print(res.group()) 和结尾^

$