Захват всей повторяющейся строки на основе повторного шаблона - PullRequest
0 голосов
/ 15 февраля 2019

Следующее регулярное выражение соответствует как 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

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

В вашем шаблоне эта часть -{1,4} соответствует 1-4 раза дефису, поэтому 59-- будет соответствовать.

Если все совпадения должны совпадать с 59, вы можете использовать сделайте обратную ссылку на первую группу захвата и повторите это 3 раза с добавленным дефисом.

\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())

Если не должно быть частичных совпаденийВы можете использовать якоря, чтобы установить начало ^ и конец $ строки:

^([0-5][0-9])(?:-\1){3}$
0 голосов
/ 15 февраля 2019

Попробуйте использовать следующий шаблон, если используете 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...