正则表达式:如何使我的代码与“ +”字符或数字匹配

时间:2018-06-22 14:38:24

标签: python regex python-3.x

我刚刚开始使用正则表达式。

我正在尝试搜索一小段“短语”,以查找英国的手机号码(以+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."]  

4 个答案:

答案 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"

Demo

答案 1 :(得分:1)

在正则表达式中,word boundary \b在空格和加号之间不匹配。

您可以做的是匹配07+44,然后匹配一个数字或空格一次或多次[\d ]+,然后匹配一个数字\d,以不匹配在末尾匹配空白,并在末尾添加单词边界\b

(?:07|\+44)[\d ]+\d\b

Demo Python

答案 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的唯一原因是因为它对您来说更安全,因为人们可能会错过输入+他们的电话号码的权利。 :)