我是Python正则表达式中的新手。这是我的短信:
'Condition: Remanufactured Grade: Commercial Warranty: 1 Year Parts & On-Site Labor w/Ext. Ships: Fully Assembled Processing Time: Ships from our Warehouse in 2-4 Weeks我想使用python正则表达式添加逗号,结果如下所示:
'Condition: Remanufactured ,Grade: Commercial ,Warranty: 1 Year Parts & On-Site Labor w/Ext. Ships: Fully Assembled ,Processing Time: Ships from our Warehouse in 2-4 Weeks基本上,我希望目标词包含冒号,并希望从第二个字符串中添加逗号。
发布于 2022-04-15 20:06:25
老实说,我不会用正则表达式来解决这个问题,这在很大程度上是基于您的“处理时间”示例,这使您看起来只有知道需要解决的特定字符串才能解决问题。
代码无法神奇地知道“处理”比“完全组装”更紧密地绑定在“时间”上。
所以我看到了三种解决方案,我只想把重点放在第一种,因为我认为这是最好的一种,但我将简要地总结这三种方案:
所以我会做选项1,总的想法是这样的:
tricky_fields = {
"Processing Time": "ProcessingTime",
# add others here as needed
}
for proper_name, easier_name in tricky_fields:
my_text = my_text.replace(f" {proper_name}: ", f" {easier_name}: ")
# do the actual comma insertions here
for proper_name, easier_name in tricky_fields:
my_text = my_text.replace(f" {easier_name}: ", f" {proper_name}: ")注意,我在替换的字段名周围放置了空格和冒号。如果您知道您的字段总是由类似的空格和冒号分隔,这是更好的做法,因为它不太可能自动替换不想替换的东西,因此以后不太可能成为bug的来源。
如果您的所有替换都不使用任何空格或冒号,那么逗号插入本身就会变成一个简单的正则表达式,因为您的目标只是[^ :]+:,但是regex是一种神秘的微语言,没有为人类的可读性进行优化,而且它不需要是正则表达式,因为您只需要在:上拆分,然后对每次分割的结果在最后一次拆分,然后用,或,重新连接,然后重新加入整个过程:
def insert_commas(text):
parts = text.split(":")
new_parts = []
for part in parts:
most, last = part.split(" ", -1)
new_part = " ,".join((most, last))
new_parts.append(new_part)
return ":".join(new_parts)但是,如果您真的想使用regex,这里有一个简单的正则表达式,它可以实现您想要的结果:
def insert_commas(text):
return re.sub(' ([^ :]+: )', r' ,\1', text)尽管在实际的生产代码中,我会改进棘手的字段替换,方法是将两个替换分解成一个单独的可测试函数,并使用一些bidict来代替常规字典,如下所示:
from bidict import bidict
tricky_fields = bidict({
"Processing Time": "ProcessingTime",
# add others here as needed
})
def replace_fields(names, text):
for old_name, new_name in names:
text = text.replace(f" {old_name}: ", f" {new_name}: ")
return text使用bidict和专用函数更清晰、更自我描述、更易于维护、更少的代码保持一致,而且更容易测试/验证,甚至可以避免将两个棘手的字段名意外地映射到相同的替换字段,从而获得一些运行时安全性。
因此,将前两个代码块组合在一起:
text = replace_fields(tricky_fields, text)
text = insert_commas(text)
text = replace_fields(tricky_fields.inverse, text)当然,如果您不需要进行第二个替换来撤消初始替换,您可以将其保留为-在完成逗号插入之后。不管是哪种方式,这种方法都是将逗号问题从棘手的名称问题中分解出来的,这使得逗号问题变得更加困难/复杂。
https://stackoverflow.com/questions/71887831
复制相似问题