我刚刚开始使用正则表达式。
我正在尝试搜索一小段“短语”,以查找英国的手机号码(以+44或07开头,有时将数字分成一个空格)。我无法让它返回以+44开始的数字。
这是我写的:
for snippet in phrases:
match = re.search("\\b(\+44|07)\\d+\\s?\\d+\\b", snippet)
if match:
numbers.append(match)
print(match)
可打印
<_sre.SRE_Match object; span=(19, 31), match='07700 900432'>
<_sre.SRE_Match object; span=(20, 31), match='07700930710'>
并且错过了“短语”中的数字+44770090999。
我尝试使用和不使用括号。如果没有括号,它也将以+10之类的总和打印出'44 + 54 = 54'。 +44之前的反斜杠是否必要?关于我所缺少的任何想法吗?
谢谢大家!
编辑:我的一些输入内容:
phrases = ["You can call me on 07700 900432.",
"My mobile number is 07700930710",
"My date of birth is 07.08.92",
"Why not phone me on 202-555-0136?"
"There are around 7600000000 people on Earth",
"If you're from overseas, call +44 7700 900190",
"Try calling +447700900999 now!",
"56+44=100."]
答案 0 :(得分:1)
您的正则表达式的问题在于,第一个\b
与+
和4
之间的单词边界匹配。空格和+
之间的边界不是单词边界。这意味着它无法在+44
之后找到\b
,因为+
在\b
的左侧。 44
的右侧只有\b
。
要解决此问题,您可以在后面使用负号,以确保+44
前没有单词。请记住将其放在捕获组中,因为只有在选择了+44
选项时,才应将其匹配。如果单词边界以07
开头,您仍然要匹配它。
((?!\w)\+44|\b07)\d+\s?\d+\b
您可以将正则表达式放入r""
字符串中。这样,您不必写太多的斜杠:
r"((?!\w)\+44|07)\d+\s?\d+\b"
答案 1 :(得分:1)
在正则表达式中,word boundary \b
在空格和加号之间不匹配。
您可以做的是匹配07
或+44
,然后匹配一个数字或空格一次或多次[\d ]+
,然后匹配一个数字\d
,以不匹配在末尾匹配空白,并在末尾添加单词边界\b
。
答案 2 :(得分:0)
这应该有帮助。
import re
phrases = ["Hello +4407700 900432 World", "Hello +44770090999 World"]
for snippet in phrases:
match = re.search(r"(?P<num>(\+44|07)\d+\s?\d+)", snippet)
if match:
print(match.group('num'))
输出:
+4407700 900432
+44770090999
答案 3 :(得分:0)
通过从字符串中删除预期的“嘈杂字符”,并将正则表达式简化为"(07|\D44)\d{9}"
,您应该能够解决所有情况。其中:
(07|\D44)
搜索以07和44开头的非数字字符的起始编号。
\d{9}
搜索其余的9位数字。
您的代码应如下所示:
cleansnippet = snippet.replace("-","").replace(" ","").replace("(0)","")...
re.search("(07|\D44)\d{9}", cleansnippet)
将此内容应用于您的输入即可获取以下内容:
<_sre.SRE_Match object; span=(14, 25), match='07700900432'>
<_sre.SRE_Match object; span=(16, 27), match='07700930710'>
<_sre.SRE_Match object; span=(25, 37), match='+44770090019'>
<_sre.SRE_Match object; span=(10, 22), match='+44770090099'>
希望有帮助。
Pd .:
\
之前的+
意味着您正在专门寻找一个+
符号,而不是前一个元素的“ 1个或多个”。
我之所以建议使用\D44
而不是\+44
的唯一原因是因为它对您来说更安全,因为人们可能会错过输入+他们的电话号码的权利。 :)