示例成品 看全文 ↓

写正则表达式

要匹配的规则在脑子里说不清楚,自己写正则老是漏情况或者写错转义符,调半天还是不对。

免费看示例成品:代码 · 文字写代码做网站 ›

有人这样说「这正则我写了半小时,还是匹配不了手机号,发群里问又怕被笑话。」

能替你选的都选好了。不想动,直接点下面「直接生成正则表达式」,点一下就开始做;想改,就点一下要的那个。

已替你选好想改就点一下

只有你知道的不填就先空着,成品里留【待填】

还想怎么改可以不选

高级选项一般不用动 · 这件事通常 1 分钟左右做好

示例成品全文按上面这组示例选项真跑出来的

直接可用:

import re

PHONE_RE = re.compile(r'(?<![-0-9])1[3-9][0-9](?:-[0-9]{4}-[0-9]{4}|[0-9]{8})(?![-0-9])')

text = "联系电话:138-1234-5678,另一个 15900001111,坏号 138-1234-56789 不取。"
print(PHONE_RE.findall(text))
# ['138-1234-5678', '15900001111']

解释人话:

  • 支持两种格式:138-1234-5678 和 13812345678
  • 1[3-9][0-9]:手机号前三位,1 开头,第二位 3-9
  • (?:-[0-9]{4}-[0-9]{4}|[0-9]{8}):后面要么是 -1234-5678,要么是连续 8 位数字
  • 头尾的 (?<![-0-9]) / (?![-0-9]):前后不能再是数字或横杠,防止把 138-1234-56789 或 138-1234-5678-999 这种截断成假号码

注意:这里用 [0-9] 而不是 \d,因为 Python 里 \d 可能会匹配到非 ASCII 数字。

提取出来后如果要去掉横杠统一入库:

phone.replace('-', '')

这个正则做的是格式和边界过滤,不是运营商号段白名单;你给的 138、159、186 开头都能正常提出。

同类还能办

全部 ›

同样出写代码做网站的

首页