Python string.replace,仅在特定情况下替换

Python string.replace, only replace under certain circumstances

我正在分析从收据中获得的销售数据。所有购买的物品都在一列中作为一个字符串,如下所示:

'1 x Sandwich, "2 x Coffee, with cream", 1 x Apple pie'

我想把所有的物品分开来计算购买的物品数量。简单的 string.split(',') 不行,因为某些项目的名称中也有逗号。幸运的是,这些名称用双引号括起来,而 'normal' 名称不是。

如何替换双引号内的逗号而不是分隔项的逗号?

如果这些名字中的逗号变成冒号,例如,解析字符串可以用string.split()来完成。所以所需的输出将是这样的:

'1 x Sandwich, "2 x Coffee: with cream", 1 x Apple pie'

可能还有其他解决方案,但这个问题让我开始考虑替换非常具体的字符。

你需要试着告诉它用一个特定的字符来分隔它。在这种情况下,尝试 string.split('"')

您的输入无效,因为缺少一个关闭 " 和一个打开 "

"1 x Sandwich, "2 x Coffee, with cream", 1 x Apple pie"
             ^                           ^

我在这里使用 Pythons csv 模块。选项 skipinitialspace 非常重要,因为在 , 之后有空白字符 (space),这在 CSV 文件中是不常见的。

#!/usr/bin/env python3
import io
import csv

your_invalid_input = '"1 x Sandwich, "2 x Coffee, with cream", 1 x Apple pie"'
valid_input        = '"1 x Sandwich", "2 x Coffee, with cream", "1 x Apple pie"'

# this simulates a file object
raw_data = io.StringIO(valid_input)

csv_reader = csv.reader(raw_data,
                        delimiter=',',
                        skipinitialspace=True)

for line in csv_reader:
    print(line)

输出为

['1 x Sandwich', '2 x Coffee, with cream', '1 x Apple pie']
text = '1 x Sandwich, "2 x Coffee, with cream", 1 x Apple pie'

def comma_changer(text):
  text = list(text)
  quote_counter = 0
  for i,char in enumerate(text):
    if char == '"':
      quote_counter+=1
    elif char == ",":
      if quote_counter%2 == 1:
        text[i] = ":"
  return("".join(text))

comma_changer(text) #'1 x Sandwich, "2 x Coffee: with cream", 1 x Apple pie'