Сопоставьте регулярное выражение со всей строкой, а не только с частью строки - PullRequest
1 голос
/ 19 марта 2019

У меня есть регулярное выражение: r'((\+91|0)?\s?\d{10})'

Я пытаюсь сопоставить числа типа +91 1234567890, 1234567790, 01234567890.

Эти цифры не должны совпадать: 1234568901112, потому что оно не начинается с +91 или 0 или не имеет только 10 чисел:

Когда я пытаюсь использовать re.findall():

re.findall(r'((\+91|0)?\s?\d{10})', '+91 1234567890, 1234567790, 01234567890, 1234568901112')
[('+91 1234567890', '+91'),
 (' 1234567790', ''),
 (' 0123456789', ''),
 (' 1234568901', '')]

Вы можете заметить, что в третьем и четвертом индексе вывод не то, что я хочу. Мой ожидаемый результат в третьем индексе - 01234568890, и потому что он начинается с 0 и сопровождается 10 символами Но он показывает только первые 10 символов. Также я не хочу вывод в 4-м индексе, потому что это число не полностью совпадает. Так что либо оно соответствует полному слову / строке, либо неверно.

Есть ли еще какие-нибудь регулярные выражения, которые я могу использовать? Или функция? Что я здесь не так делаю?

Ожидаемый результат:

[('+91 1234567890','1234567790', '01234567890']

Пожалуйста, дайте мне знать, если понадобятся дополнительные разъяснения.

1 Ответ

2 голосов
/ 19 марта 2019

Вы можете использовать

r'(?<!\w)(?:(?:\+91|0)\s?)?\d{10}\b'

См. Демоверсию regex .

Смысл в том, чтобы сопоставить эти шаблоны как целые слова, проблема в том, что первая часть является необязательной, а одна из необязательных альтернатив начинается с несловарного символа, поэтому выигрывает одна \b граница слова 'здесь не работает.

Подробности

  • (?<!\w) - слева от текущего местоположения не должно быть слова char
  • (?:(?:\+91|0)\s?)? - необязательный экземпляр
    • (?:\+91|0) - +91 или 0
    • \s? - необязательный пробел
  • \d{10}\b - десятизначное совпадение как целое слово, с обеих сторон не допускается использование символов слова

Демонстрация Python :

import re
s = '+91 1234567890, 1234567790, 012345678900, 1234568901112, 01234567890'
print(re.findall(r'(?<!\w)(?:(?:\+91|0)\s?)?\d{10}\b', s))
# => ['+91 1234567890', '1234567790', '01234567890']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...