如何用Python正则提取字符串列表的ID、日期和价格生成DataFrame
解决正则提取价格及生成DataFrame的方案
修正正则表达式
原有正则存在两个问题:
- 日期正则要求月、日必须为2位,无法匹配
1/11/2020这类单数字月/日的格式 - 价格正则会匹配所有整数、浮点数,会把ID后缀、行首的0、1等无关数字提取出来,导致价格列表数据混乱
修正后的正则如下:
import re import pandas as pd # 支持1/2位的月、日匹配 date_reg_exp = re.compile(r'\d{1,2}/\d{1,2}/\d{4}') # 利用零宽断言,仅匹配 ;3; 后面的带小数价格,排除其他数字干扰 price_reg_exp = re.compile(r'(?<=;3;)\d+\.\d+')
如果后续价格可能出现不带小数的整数格式,可以把价格正则调整为
r'(?<=;3;)\d+(?:\.\d+)?'即可兼容。
调整数据处理逻辑
遍历每行时将同组的日期和价格一一对应,和ID拼接成元组存入结果列表,最后直接转换为DataFrame:
result = [] for data_row in self._data: # 提取当前行ID bbg_id = data_row.split('|')[0] # 提取当前行所有日期 date_list = [x.group() for x in date_reg_exp.finditer(data_row)] # 提取当前行所有价格 price_list = [x.group() for x in price_reg_exp.finditer(data_row)] # 日期价格配对后和ID组合存入结果 for date, price in zip(date_list, price_list): result.append((bbg_id, date, price)) # 转换为DataFrame,可自定义列名 df = pd.DataFrame(result, columns=['ID', '日期', '价格'])
输出效果
处理后的DataFrame和需求格式完全一致:
ID 日期 价格 0 ID1 12/11/2020 10.0000 1 ID1 06/11/2021 9.0000 2 ID2 1/11/2020 11.0000 3 ID2 1/11/2021 12.0000
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

