Python实现长字符串转DataFrame:菜品数据转分类、菜名、价格列
解决餐单字符串转分类+菜品+价格DataFrame的问题
我来帮你搞定这个餐单转DataFrame的需求!你的字符串是按全大写分类标签(比如APPETIZERS、ENTREES)划分菜品,每个菜品末尾跟着两位小数的价格,我们可以用正则表达式精准拆分这些内容,一步步实现:
步骤1:预处理字符串并匹配分类
首先把字符串里的HTML实体&替换成正常的&,然后用正则捕获每个分类及其对应的所有菜品内容:
步骤2:拆分每个菜品的名称和价格
针对每个分类下的菜品块,再用正则拆分出单个菜品的名称和价格,最后整理成DataFrame需要的结构。
完整代码实现
import re import pandas as pd # 你的原始餐单字符串 meals_string = "APPETIZERS Southern Fried Quail with Greens,Huckleberries,Pecans & Blue Cheese 14.00 Park Avenue Cafe Chopped Salad Goat Feta Cheese,Nigoise Olives,Marinated White [...] ENTREES Horseradish Crusted Canadian Salmon,Potato Fritters, Marinated Cucumbers,Chive Vinaigrette 27.00 Sautéed Prawns with Mushroom Tortellini,Grilled Tomato Vinaigrette & Sweet Corn 29.50" # 替换HTML实体,还原正常的&符号 cleaned_string = meals_string.replace("&", "&") # 正则匹配分类标签(全大写)和该分类下的所有菜品内容 category_pattern = r"([A-Z]+)\s+(.*?)(?=\s+[A-Z]+|$)" category_matches = re.finditer(category_pattern, cleaned_string, re.DOTALL) # 存储最终数据的列表 meal_data = [] for cat_match in category_matches: category = cat_match.group(1) items_block = cat_match.group(2).strip() # 拆分每个菜品:匹配菜品名称(直到最后两位小数价格前的内容)和价格 item_pattern = r"(.*?)\s+(\d+\.\d{2})(?=\s|$)" item_matches = re.finditer(item_pattern, items_block) for item_match in item_matches: meal_name = item_match.group(1).strip() price = float(item_match.group(2)) meal_data.append({ "Category": category, "Meal_name": meal_name, "Price": price }) # 转换为DataFrame meal_df = pd.DataFrame(meal_data) print(meal_df)
代码说明
- HTML实体替换:把
&换成&,避免后续文本处理时出现异常; - 分类匹配正则:
([A-Z]+)\s+(.*?)(?=\s+[A-Z]+|$)捕获全大写的分类名称,然后捕获该分类下的所有内容,直到遇到下一个全大写分类或字符串结尾; - 菜品拆分正则:
(.*?)\s+(\d+\.\d{2})(?=\s|$)捕获菜品名称(所有内容直到最后两位小数的价格前),然后提取价格并转为浮点数; - 数据整理:把每个菜品的分类、名称、价格存入字典,最后转成DataFrame。
扩展说明
如果你的分类标签是多个全大写单词(比如MAIN COURSES),只需要把分类匹配的正则调整为:
category_pattern = r"([A-Z\s]+?)\s+(.*?)(?=\s+[A-Z]+|$)"
这样就能正确捕获多单词的分类名称了。
内容的提问来源于stack exchange,提问作者default_settings
相关产品推荐
相关产品推荐

