Python 3.9:修改正则以提取多组数据并存入DataFrame列
适配多模式的DataFrame正则提取方案
问题背景
需要从DataFrame的name列中提取两类信息:文本主体内容和逗号后的数字ID,但现有正则仅适配前两行格式,需修改以覆盖所有样本模式。
样本name列数据
name ?|{Type 2 diabetes mellitus, susceptibility to}, 125853 (3) {Type 2 diabetes mellitus}, 125854 (3) 17,20-lyase deficiency, isolated, 202110 (3) 17-alpha-hydroxylase/17,20-lyase deficiency, 202110 (3) ?Agammaglobulinemia 4, 613502 (3) ?[Dysalbuminemic hypertriiodothyroninemia], 615999 (3) 3p- syndrome (4) 3m-syndrome (4)
当前仅适配部分行的代码
df_new = df.join(df[name].str.extractall("{(.*)}, (.*) \(")[0] .unstack() .add_prefix('newColumn'))
解决方案
修改后的正则表达式与代码
使用能覆盖所有模式的正则,结合str.extract(单组提取无需extractall)完成适配:
import pandas as pd # 构建示例DataFrame data = { 'name': [ '?|{Type 2 diabetes mellitus, susceptibility to}, 125853 (3)', '{Type 2 diabetes mellitus}, 125854 (3)', '17,20-lyase deficiency, isolated, 202110 (3)', '17-alpha-hydroxylase/17,20-lyase deficiency, 202110 (3)', '?Agammaglobulinemia 4, 613502 (3)', '?[Dysalbuminemic hypertriiodothyroninemia], 615999 (3)', '3p- syndrome (4)', '3m-syndrome (4)' ] } df = pd.DataFrame(data) # 提取并合并结果 df_new = df.join( df['name'].str.extract(r'^[?|]*[{\[]?(.*?)[}\]]?,?\s*(\d+)\s*\(', expand=True) .rename(columns={0: 'text_content', 1: 'id_number'}) ) # 查看结果 print(df_new)
正则表达式说明
^[?|]*[{\[]?(.*?)[}\]]?,?\s*(\d+)\s*\( 各部分作用:
^[?|]*:匹配行首任意数量的?或|前缀[{\[]?:匹配可选的{或[文本包裹符(.*?):非贪婪匹配文本主体,避免误匹配到后续逗号[}\]]?,?:匹配可选的}或]包裹符,以及后续可选的逗号\s*(\d+)\s*\(:匹配数字ID,忽略前后空格,匹配到(前结束
提取结果示例
最终df_new会新增两列:
text_content:提取后的纯文本(去掉前缀、包裹符)id_number:对应的数字ID,包括最后两行无逗号的情况
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

