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

如何用正则表达式从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:25:30