正则捕获带逗号小数:energy列表转指定DataFrame的问题
解决Python列表转指定DataFrame的正则提取问题
需求说明
现有Python列表energy,元素为包含多组键值对的字符串(键是带空格的能源名称,值是带逗号的小数),需将其转换为包含key和value两列的DataFrame,目标格式如下:
key value 0 Wind 1.00 1 Water 7.36 2 Renewable Cogeneration 9.71 3 Other Renewables 9.65 4 Solid Waste 2.80 5 Fossil Cogeneration 2.17 6 Natural Gas 56.35 7 Coal 9.73 8 Nuclear 0.64
此前的正则表达式提取出了冗余内容,生成的结果包含多余后续文本,需要修正正则以精准提取每组独立的键值对。
解决方案
正确的正则表达式
使用以下正则可精准匹配每组键值对:
(\w+(?:\s+\w+)*)\s+(\d+,\d{2})
(\w+(?:\s+\w+)*):匹配包含空格的完整键名(如Renewable Cogeneration),非捕获组(?:\s+\w+)*允许键包含多个空格分隔的单词\s+:匹配键与值之间的间隔空格(\d+,\d{2}):匹配带两位小数的数值格式(如1,00)
完整代码实现
import re import pandas as pd # 示例输入列表 energy = [ 'Wind 1,00 Water 7,36 Renewable Cogeneration 9,71 Other Renewables 9,65 Solid Waste 2,80', 'Fossil Cogeneration 2,17 ', 'Natural Gas 56,35 Coal 9,73 Nuclear 0,64 ' ] # 编译正则模式 pattern = re.compile(r'(\w+(?:\s+\w+)*)\s+(\d+,\d{2})') # 收集所有键值对 key_value_pairs = [] for item in energy: # 去除字符串首尾空格,避免无效匹配 cleaned_item = item.strip() # 提取当前字符串中所有匹配的键值对 matches = pattern.findall(cleaned_item) for key, val in matches: # 将逗号替换为点,转换为浮点数值 key_value_pairs.append({'key': key, 'value': float(val.replace(',', '.'))}) # 生成目标DataFrame result_df = pd.DataFrame(key_value_pairs) print(result_df)
代码说明
- 使用
re.compile()预编译正则,提升匹配效率 - 对每个列表元素执行
strip()去除首尾空格,避免无效匹配 findall()方法一次性提取字符串中所有符合规则的键值对,不会产生冗余内容- 将数值中的逗号替换为点并转为
float类型,符合DataFrame的数值格式要求
内容的提问来源于stack exchange,提问作者Daila
相关产品推荐
相关产品推荐

