写正则表达式
要匹配的规则在脑子里说不清楚,自己写正则老是漏情况或者写错转义符,调半天还是不对。
有人这样说「这正则我写了半小时,还是匹配不了手机号,发群里问又怕被笑话。」
能替你选的都选好了。不想动,直接点下面「直接生成正则表达式」,点一下就开始做;想改,就点一下要的那个。
已替你选好想改就点一下
只有你知道的不填就先空着,成品里留【待填】
还想怎么改可以不选
高级选项一般不用动 · 这件事通常 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 开头都能正常提出。