我正在重新格式化大量销售数据。
每次销售都会显示商品名称、所售商品的数量以及四舍五入到最接近整数的价格。
1 袋 20 个苹果售价 3 美元:
苹果/,20,3,
如果发生不止一次销售,销售数据会替换第一个结果之后的每个结果的项目名称。
4 袋 20 个苹果售价 3 美元: Apple/,20,3%20,3%20,3%20,3,
我需要为每次销售显示商品名称而不是 % 符号
期望的结果:Apple/,20,3,Apple/,20,3,Apple/,20,3,Apple/,20,3,
到目前为止: 我已经为此苦苦思索了六个小时,并尝试了几种方法。
我曾想过使用表达式 ([A-Za-z]+\/)?(\%)?(\d+\,\d+\,) 在 python 中使用 re 模块运行正则表达式替换
将 \1\3
替换为完整匹配项后会产生所需的结果,但这只会将第一个捕获组应用于第三个捕获组的所有连续匹配项的开头。
苹果/,20,3,20,3,20,3,20,3,
我怀疑这与捕获组和捕获对象之间的区别有关,但我一直在尝试寻找一种方法将第一个捕获组附加到给定捕获组的捕获对象的每个外观(例如,追加捕获组 1 到捕获组 3 的每场比赛的开始。)
为了解决这个问题,我尝试了修改版本的答案:https://stackoverflow.com/questions/32670413/replace-all-matches-using-re-findall
/p>
import re
regex = re.compile('([A-Za-z]+\/)?(\%)?(\d+\,\d+\,)', re.S)
itemsales = 'Apple/20,3,%20,3,%20,3,%20,3,'
sales_fixed = regex.sub(lambda m: m.group().replace('%',"\1",1), myfile)
print(sales_fixed)
这将返回完全相同的结果
Apple/,20,3,20,3,20,3,20,3,
我怀疑这可能是在替换中错误地引用了我的捕获组的结果
如何用产品名称替换百分号?
最佳答案
您尝试的模式只匹配最后一部分,因为前两部分是可选的,它可以匹配 %
和 20,3,
部分
匹配问题中描述的格式,您可以在第 1 组中首先匹配 Apple/
后重复匹配逗号数字的部分,后跟 %
.
然后在替换中,在 2 个逗号的 x.group(1)
关于代码和模式的几点说明:
- 您不必使用
re.S
,因为模式中没有必须匹配换行符的点。 - 您不必转义
、
/
和%
- 问题描述和示例代码中使用了 2 个不同的字符串。
模式可能是这样的:
\b([A-Za-z]+/),(?:\d+,\d+%)+
\b
防止部分匹配的单词边界(
捕获组 1[A-Za-z]+/
匹配 1+ 次 A-Z a-z 范围内的字符
)
关闭第 1 组,(?:\d+,\d+%)+
匹配一个逗号,并重复 1+ 次匹配 1+ 个数字,一个逗号并再次匹配 1+ 个数字
例如
import re
pattern = r"\b([A-Za-z]+/),(?:\d+,\d+%)+"
itemsales = "Apple/,20,3%20,3%20,3%20,3,"
sales_fixed = re.sub(
pattern,
lambda x: x.group().replace('%', ",{0},".format(x.group(1))),
itemsales
)
print(sales_fixed)
输出
Apple/,20,3,Apple/,20,3,Apple/,20,3,Apple/,20,3,
关于python - 正则表达式用另一个捕获组替换捕获组的每次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67250108/