PySpark使用regexp_extract提取含特殊字符文本中纯数字的问题
PySpark 自由文本列提取纯数字实现方案
原代码失效原因
你写的提取逻辑存在三处问题,无法得到预期结果:
- 语法错误:列选择写法错位,
df['freeText',r'(^[0-9])']方括号使用错误,且regexp_extract函数的括号未闭合,运行本身就会报错 - 正则逻辑错误:
^[0-9]仅匹配字符串开头位置的单个数字,既无法匹配文本中间、末尾的数字,也无法提取多位连续数字 - 场景适配错误:正则限定了仅匹配开头的数字,完全覆盖不了
DH-09878877ABC、qwert9876788plk这类非数字开头、数字夹杂在字符/符号中的场景
正确实现代码
如果要提取文本中所有数字并拼接成完整账号,直接用正则替换把所有非数字字符清空即可,逻辑简单性能更好:
from pyspark.sql.functions import regexp_replace df = df.withColumn( "acount_nbr", regexp_replace("freeText", r"[^0-9]", "") )
针对你给出的三类样例数据,提取结果完全符合预期:
- 输入
DH-09878877ABC→ 输出09878877 - 输入
9009898DEC→ 输出9009898 - 输入
qwert9876788plk→ 输出9876788
特殊场景说明:如果文本中存在多段分散的数字、你仅需要提取第一段连续数字,可以换用
regexp_extract实现:from pyspark.sql.functions import regexp_extract df = df.withColumn( "acount_nbr", regexp_extract("freeText", r"(\d+)", 1) )该写法遇到
DH-123ABC456这类内容时只会提取第一段数字123,不会拼接后续的456,可根据实际业务需求选择。
内容的提问来源于stack exchange,提问作者user12039174
相关产品推荐
相关产品推荐

