You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改正则表达式去除Pandas DataFrame中字符串的问号并提取子串

Pandas正则提取:去除问号并提取标签与ID

问题场景

现有Pandas DataFrame的name列包含特殊格式文本,需要提取标签(label)和数字ID,同时要移除部分行开头的问号(如[?xxx]结构中的?),当前正则表达式无法完成问号的去除操作。

现有代码

df[['label', 'id']] = df['name'].str.extract(r'\{?\??\|?[[{]?(.*?)[]}]?(?:,\s+(\d{3,100}))?\s+\(\d+\)')

原始数据

You-Hoover-Fong syndrome, 616954 (3)
Yuan-Harel-Lupski syndrome (4)
Zaki syndrome, 619648 (3)
Zimmermann-Laband syndrome 2, 616455 (3)
Zimmermann-Laband syndrome 3, 618658 (3)
[?Birbeck granule deficiency], 613393 (3)
[?Homosexuality, male] (2)
[?Phosphohydroxylysinuria], 615011 (3)
[Acetylation, slow], 243400 (3)

期望输出

You-Hoover-Fong syndrome          616954  
Yuan-Harel-Lupski syndrome
Zaki syndrome                     619648
Zimmermann-Laband syndrome 2      616455 
Zimmermann-Laband syndrome 3      618658 
Birbeck granule deficiency        613393 
Homosexuality, male 
Phosphohydroxylysinuria           615011 
Acetylation, slow                 243400 

修改后的正则代码

df[['label', 'id']] = df['name'].str.extract(r'^\[?\??(.*?)\]?(?:,\s+(\d{3,100}))?\s+\(\d+\)$')

正则逻辑说明

  • ^:锚定字符串开头,避免匹配中间无关内容
  • \[?\??:匹配开头可选的[和?,这部分会被跳过,不进入捕获组
  • (.*?):捕获核心标签内容,直到遇到后续的闭合]或ID分隔符
  • \]?:匹配可选的闭合],同样跳过不捕获
  • (?:,\s+(\d{3,100}))?:处理可选的ID部分,非捕获组包裹结构,内部(\d{3,100})捕获数字ID
  • \s+\(\d+\)$:匹配末尾的空格加括号内的数字,锚定到字符串结尾

修改后可兼容所有格式的行,自动移除目标问号,同时准确提取标签与ID。


内容的提问来源于stack exchange,提问作者rshar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:00:23