如何用正则表达式从Pandas列字符串提取化学属性子串
解决正则提取匹配对象而非目标值的问题
问题根源
你当前代码里使用regex.match()返回的是正则匹配对象,而非捕获到的属性值。需要通过匹配对象的.group(1)方法提取第一个捕获组(即括号(.*?)里的内容)。另外原代码创建DataFrame时存在参数错误,会导致列不匹配,需要先修正。
修正后的完整代码
import pandas as pd import re # 若你使用第三方regex库,替换为import regex即可 data = [ '''{name Boiling Point property 153 °C @ Press 12 Torr sourceNumber 1} {name Density property 0.9211 g/cm<sup>3</sup> @ Temp 20 °C sourceNumber 1}''', '''{name Boiling Point property 58 °C @ Press 12 Torr sourceNumber 1} {name Density property 0.8753 g/cm<sup>3</sup> @ Temp 20 °C sourceNumber 1}''', '''{name Boiling Point property 175.5-176 °C @ Press 763 Torr sourceNumber 1} {name Melting Point property -74.35 °C sourceNumber 1} {name Density property 0.8402 g/cm<sup>3</sup> @ Temp 25 °C sourceNumber 1}''', '''{name Boiling Point property 103-105 °C @ Press 16 Torr sourceNumber 1} {name Melting Point property 51 °C sourceNumber 1}'''] casnumber = [ "1", "2", "3", "4"] # 修正DataFrame创建:用字典映射列名与对应数据列表 df = pd.DataFrame({'casnumber': casnumber, 'experimental_properties': data}) # 创建属性字典 boiling_points = {} melting_points = {} densities = {} for index, row in df.iterrows(): cas = str(row.casnumber) exp_prop = str(row.experimental_properties) # 提取沸点:先匹配再判断是否成功,最后取捕获组内容 bp_match = re.search(r'Boiling Point property (.*?) sourceNumber', exp_prop) if bp_match: boiling_points[cas] = bp_match.group(1).strip() # 提取熔点 mp_match = re.search(r'Melting Point property (.*?) sourceNumber', exp_prop) if mp_match: melting_points[cas] = mp_match.group(1).strip() # 提取密度 density_match = re.search(r'Density property (.*?) sourceNumber', exp_prop) if density_match: densities[cas] = density_match.group(1).strip() # 验证输出 print("沸点字典:", boiling_points) print("熔点字典:", melting_points) print("密度字典:", densities)
关键改动说明
- 修正DataFrame创建:原代码将
data直接作为第一列,导致列数不匹配,改用字典映射列名和对应数据列表,保证数据对应正确。 - 替换
match为search:match仅从字符串开头匹配,而属性可能出现在字符串中间,search会扫描整个字符串找到匹配项。 - 提取捕获组内容:通过
.group(1)获取正则中括号内捕获的属性值,并用.strip()去除前后多余空格。 - 增加匹配判断:避免因匹配失败导致
AttributeError,先判断匹配对象是否存在再提取值。
预期输出
沸点字典: {'1': '153 °C @ Press 12 Torr', '2': '58 °C @ Press 12 Torr', '3': '175.5-176 °C @ Press 763 Torr', '4': '103-105 °C @ Press 16 Torr'} 熔点字典: {'3': '-74.35 °C', '4': '51 °C'} 密度字典: {'1': '0.9211 g/cm<sup>3</sup> @ Temp 20 °C', '2': '0.8753 g/cm<sup>3</sup> @ Temp 20 °C', '3': '0.8402 g/cm<sup>3</sup> @ Temp 25 °C'}
内容的提问来源于stack exchange,提问作者CharlieBitMaFinga
相关产品推荐
相关产品推荐

