我使用的正则表达式是^s*(d+)s*(([A-Za-z]+s*)+)?(d+)s+(.+?)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)$
解析并分类以下示例数据字符串时"1 NA饮料1100冰茶14.00 3.00 42.00 3.50 0.00 42.00 0.00 0.52 47.09">
输出不正确:当您在将分类数据转换为JSON之前查看它时,您看到'item_category': 'NA BEVERAGE ', 'item_number': 'BEVERAGE ' It should be 'item_category': 'NA BEVERAGE ', 'item_number':'1100'
等。
我希望:
{'item_rank': '1', 'item_category': 'NA BEVERAGE ', 'item_number': 'BEVERAGE ', 'item_name': '1100', 'number_sold': 'ICED TEA', 'price_sold': '14.00', 'amount': '3.00', 'tax': '42.00', 'cost': '3.50', 'profit': '0.00', 'food_cost': '42.00', 'precent_sales': '0.00', 'cat_sales': '0.52'}
我多次尝试修复正则表达式,但无济于事。我希望你能解释一下问题所在。
以下是python脚本的逻辑,你可以复制并在你自己的机器上运行:import re
import json
page_text_str = " 1 NA BEVERAGE 1100 ICED TEA 14.00 3.00 42.00 3.50 0.00 42.00 0.00 0.52 47.09"
sale_line_re = re.compile('^s*(d+)s*(([A-Za-z]+s*)+)?(d+)s+(.+?)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)$')
grouped_data = []
for line in page_text_str.split('n'):
print(line)
match = sale_line_re.match(line)
if match:
groups = match.groups()
item = {
"item_rank": groups[0],
"item_category": groups[1],
"item_number": groups[2],
"item_name": groups[3],
"number_sold": groups[4],
"price_sold": groups[5],
"amount": groups[6],
"tax": groups[7],
"cost": groups[8],
"profit": groups[9],
"food_cost": groups[10],
"precent_sales": groups[11],
"cat_sales": groups[12]
}
grouped_data.append(item)
for sale in grouped_data:
print(sale)
与其构建一个正则表达式来描述所有的数字等,不如通过数字之间的空格来使用re.split
函数,同时忽略单词之间的空格。这个函数返回一个列表,然后你可以遍历它来构建一个JSON。
(?<=d)s|s(?=d)
(?<=d)
,lookbehind:数字后面的所有内容(?=d)
,向前看:数字之前的所有内容s|s
-匹配数字前后的空格。
regex101.com
问题是您正在重复一个捕获组,它将具有上次迭代的组值。
你可以修改(([A-Za-z]+s*)+)?
——>((?:[A-Za-z]+s+)+)?
这个改变将:
-
重复一个非捕获组,所以现在你有整个值在组2
-
在非捕获组的重复中重复空格字符1+次
^s*(d+)s*((?:[A-Za-z]+s+)+)?(d+)s+(.+?)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)s+(d+.d+)$
查看此正则表达式演示和Python代码中的更新模式