import re
def extract_phone_numbers(text):
# 中国手机号正则表达式
pattern = r"(?<!\d)(1[3-9]\d{9})(?!\d)"
# 提取出所有匹配项
phone_numbers = re.findall(pattern, text)
return phone_numbers
text = "张三的手机号码是13800138000,李四的手机号码是13988889999。"
phone_numbers = extract_phone_numbers(text)
print(phone_numbers) # 输出:['13800138000', '13988889999']
# maybe a better version
def extract_phone_numbers(text):
text = re.sub(r"[\(\)\s-]+", "", text) # 将文本中的括号、空格及连字符 删除
# 中国手机号正则表达式
pattern = r'\d{11}'
# 提取出所有匹配项
phone_numbers = re.findall(pattern, text)
return phone_numbers
pattern
中的正则表达式用于匹配中国大陆手机号。让我们详细解释一下这个正则表达式的各个部分:
-
(?<!\d)
: 这是一个否定顺序环视(negative lookbehind),它表示匹配手机号前面不能有数字。换句话说,手机号前面的字符不能是 0-9 之间的任何一个数字。 -
(1[3-9]\d{9})
: 这是手机号的主匹配部分。1
:表示手机号以数字 1 开头。[3-9]
:表示手机号的第二位数字是 3 到 9 之间的任何一个数字。\d{9}
:表示接下来是 9 个数字(\d
表示数字,{9}
表示重复 9 次)。
-
(?!\d)
: 这是一个否定顺序前瞻(negative lookahead),表示手机号后面不能有数字。换句话说,手机号后面的字符不能是 0-9 之间的任何一个数字。
这个正则表达式可以有效地匹配中国大陆的手机号,同时避免匹配到中间包含手机号格式的更长数字串。例如,数字序列12313800138000999
虽然包含了一个手机号13800138000
,但由于它前后都有数字,所以不会被错误匹配。