Python 正则表达式:如何使我的代码与'+';字符或数字
我刚开始使用正则表达式 我正在尝试搜索一个简短的“短语”列表,以查找英国手机号码(从+44或07开始,有时数字被一个空格分隔)。我很难让它返回从+44开始的数字 这是我写的: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) 哪张照片 &
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"