如何修改正则表达式去除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
相关产品推荐
相关产品推荐

