-2

我正在尝试以特定格式匹配电话号码,就像 021-768-4444我编写了一个程序,当将字符串传递给正则表达式时识别有效的电话号码,并且我的程序成功完成了此任务,但是当我通过电话时除了这种格式之外的数字,它也可以识别而不是显示给我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.')

这对我来说是非常奇怪的行为,有人可以指导我哪里错了吗?任何帮助将不胜感激。谢谢

4

3 回答 3

0
(?<!\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

于 2020-04-19T13:44:33.513 回答
-1

正如@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")

于 2020-04-19T13:50:03.430 回答
-1

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
于 2020-04-19T13:37:44.257 回答