Регулярное выражение для соответствия номеру телефона в строке - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь сопоставить номер телефона в указанном формате c, например 021-768-4444, для этого я написал программу, которая распознает действительный номер телефона при передаче строки в регулярное выражение, и успешно завершил свою программу. sh это задание, но когда я передаю номер телефона, отличный от этого формата, он также распознает, а не показывает None:

Вот код:

import re
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
mo = phoneNumRegex.search('My number is 415-555-42424854-201.')
if mo is not None:
    print('Phone number found: ' + mo.group())
else:
    print("Pattern is not matched")

Над кодом дай мне этот вывод:

Phone number found: 415-555-4242

, пока я ожидаю, что он будет None, потому что я знаю, что метод search () вернет None, если шаблон регулярного выражения не найден в строке.

Но если я передам правильный номер телефона, он будет работать, как и ожидалось:

mo = phoneNumRegex.search('My number is 415-555-4242.')

Это очень странное поведение для меня, кто-то может подсказать мне, где я ошибаюсь? Любая помощь будет принята с благодарностью. Спасибо

Ответы [ 3 ]

1 голос
/ 19 апреля 2020
(?<!\d)\d{3}\-\d{3}\-\d{4}(?!\d)

https://regex101.com/r/VAaA7k/1

phoneNumRegex = re.compile(r'(?<!\d)\d{3}\-\d{3}\-\d{4}(?!\d)')

https://www.ideone.com/4Ajfqe


Чтобы предотвратить другие нежелательные совпадения, используйте более сильное регулярное выражение

(?:^|:|(?<=\s))(\d{3}\-\d{3}\-\d{4})(?=[\s,;.]|$)

https://regex101.com/r/VAaA7k/5

0 голосов
/ 19 апреля 2020

В ответе @deceze, согласно вашему заданному регулярному выражению, оно работает так, как вы никогда не упоминали «это не должно быть длиннее».

Добавление \ b в конце регулярного выражения будет работать для вас

как показано ниже

import re phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d\b') mo = phoneNumRegex.search('My number is 415-555-42424854-201.') if mo is not None: print('Phone number found: ' + mo.group()) else: print("Pattern is not matched")

0 голосов
/ 19 апреля 2020

search проверить, соответствует ли регулярное выражение части строки. т.е. поиск по регулярному выражению в строке. match проверка соответствия регулярного выражения всей строке.

mo = phoneNumRegex.match('My number is 415-555-42424854-201.')
mo is None //True

Другой вариант - сопоставление начала и конца строки -

phoneNumRegex = re.compile(r'^\d\d\d-\d\d\d-\d\d\d\d$')
mo = phoneNumRegex.search('My number is 415-555-42424854-201.')
mo is None //True
...