Python 正则表达式:如何使我的代码与'+';字符或数字

Python 正则表达式:如何使我的代码与'+';字符或数字,python,regex,python-3.x,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) 哪张照片 &

我刚开始使用正则表达式

我正在尝试搜索一个简短的“短语”列表,以查找英国手机号码(从+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'>
这应该会有所帮助

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'))

您应该能够通过从字符串中删除预期的“嘈杂字符”来覆盖所有情况,并将正则表达式简化为仅
“(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
的唯一原因是,这样对您来说更安全,因为人们可能会错过在他们的号码之前键入+的机会。:)

正则表达式的问题是第一个
\b
+
4
之间的单词边界相匹配。空格和
+
之间的边界不是单词边界。这意味着它无法在
\b
之后找到
+44
,因为
+
位于
\b
的左侧。在
\b
的右侧只有
44

要解决此问题,您可以使用反向查找来确保
+44
之前没有单词。请记住将其放在捕获组中,因为只有在选择了
+44
选项时才应匹配它。如果单词边界以
07
开头,您仍然希望匹配它

((?!\w)\+44|\b07)\d+\s?\d+\b
您可以将正则表达式放入
r”“
字符串中。这样,您就不必写那么多斜杠:

r"((?!\w)\+44|07)\d+\s?\d+\b"
在正则表达式中,
\b
在空格和加号之间不匹配

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


请包含您的输入(或至少是一个示例),以便我们可以验证您的观察结果,并希望我们能够提供解决方案。看起来您的匹配有效,但您没有打印出所有组,而只是打印出
匹配
对象您正在将正则表达式作为字符串传递,因此反斜杠应该加倍,像
\+
而不是
\+
使用原始字符串(
r'.'
)可以避免这种复杂性。顺便说一句,我个人建议
[+]
,而不是
\+
;这样,它在引用上下文时具有相同的含义,而不是强迫读者判断某个外部上下文是否使用斜杠。
((?!\w)\+44|\b07)\d+\s?\d+\b
r"((?!\w)\+44|07)\d+\s?\d+\b"