以下正则表达式同时匹配59-59-59
和59-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-59
或59-59-59-59-59
不匹配
答案 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())
和结尾^
:
$