混合数字与拼写数字的电话号码识别及正则方案问询
混合数字格式电话号码的提取与DataFrame筛选方案
一、修正后的正则表达式
针对混合阿拉伯数字(0-9)与英文数字单词(zero-nine)的电话号码,比如+89 one5zero 77three3、+eight2three 555 seven21这类格式,可用以下正则表达式匹配:
import re # 编译正则,忽略大小写适配不同写法的英文数字 phone_pattern = re.compile( r'(?<!\S)\+?(?:(?:\d|zero|one|two|three|four|five|six|seven|eight|nine)+(?:\s+|$))+', re.IGNORECASE )
正则逻辑说明:
(?<!\S):确保匹配内容的开头是空白或字符串起始,避免从其他单词中间截取\+?:匹配可选的国际区号前缀+(?:\d|zero|one|nine)+:匹配任意长度的阿拉伯数字与英文数字的混合块(比如one5zero、77three3这类组合)(?:\s+|$):匹配块之间的空格分隔,或字符串结尾re.IGNORECASE:兼容Zero、ONE这类大小写混合的英文数字写法
二、从文本中提取目标号码
用findall方法可直接提取文本中所有符合模式的内容:
sample_text = "联系电话:+89 one5zero 77three3,备用号:+eight2three 555 seven21" matches = phone_pattern.findall(sample_text) # 输出:['+89 one5zero 77three3', '+eight2three 555 seven21']
三、筛选DataFrame中包含目标模式的行
假设你的DataFrame有一列名为content存储待检测文本,可用str.contains快速筛选:
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'content': [ "客户电话:+89 one5zero 77three3", "普通文本,无特殊号码", "备用联系方式:+eight2three 555 seven21" ] }) # 筛选包含目标号码的行 filtered_df = df[df['content'].str.contains(phone_pattern, na=False)]
四、原正则的问题说明
你之前的正则效果不佳,主要是两个原因:
- 用
\b作为边界,但+不属于单词边界字符,导致带+前缀的号码无法匹配 - 分组逻辑是单独匹配单个数字或英文单词,无法处理
one5zero这种阿拉伯数字与英文混合在同一块的情况
内容的提问来源于stack exchange,提问作者Dasha
相关产品推荐
相关产品推荐

