Python 如何在文本行中替换这些值

Python 如何在文本行中替换这些值,python,regex,Python,Regex,我有几行文字。第一行是标题行,后面的每一行表示数据字段,每个值用逗号分隔。每行中有一到三美元的价值,从一位数的美元价值($4.50)到三位数($100000.34)不等。它们也被引号包围着 2063609415465685679,“$4073.77”,56784567647,“$88457.21”,34589309683 我需要删除货币值的引号和美元符号,以及里面的逗号。十进制值的句点分隔符需要保留,因此“$6801.56”变为6801.56 我用正则表达式消除了美元符号和报价-- 然后使数据看

我有几行文字。第一行是标题行,后面的每一行表示数据字段,每个值用逗号分隔。每行中有一到三美元的价值,从一位数的美元价值($4.50)到三位数($100000.34)不等。它们也被引号包围着

2063609415465685679,“$4073.77”,56784567647,“$88457.21”,34589309683

我需要删除货币值的引号和美元符号,以及里面的逗号。十进制值的句点分隔符需要保留,因此“$6801.56”变为6801.56

我用正则表达式消除了美元符号和报价--

然后使数据看起来像
7545245,6801.563545647
所以如果我用逗号分开,它会把较大的值一分为二

['2063609415465685679,4073.7756784567647,88457.2134589309683']

我曾考虑过按引号拆分,执行更多的正则表达式并使用.join()重新连接,但结果表明,只有带逗号的货币值包含引号,而不带逗号的较小值不包含引号

另外,我知道我可以使用
re.findall(r'\$\d{1,3}\,\d\d\d\.\d\d',I)
来绘制数字格式,如果我打印它,它将输出一个类似
[$100351.35]


我只是不知道在那之后该怎么办

我建议使用(或
csv.DictReader
如果您想对每列进行其他处理)读取文件,因为这将自动解析每列。读取文件后,可以对每列执行正则表达式,因此无需自己拆分行。
csv.reader
的默认
分隔符和
quotechar
是您所需要的,我相信。

您是否尝试了模块
区域设置
?如
这比正则表达式简单。

首先,您可以删除引号内的所有逗号

伪代码可能如下所示:

s = Your String
insideQuotes = false;
charIndex = 0;
while (c = nextChar() != null){
    if(c == "\""){
        insideQuotes = !insideQuotes;
    }else if(insideQuotes && c == ","){
        s.removeAt(charIndex, "");
        charIndex--;
    }
}
现在引号中没有逗号了,您只需要删除美元符号和引号本身

希望有帮助

这似乎有效:

>>> data = '206360941,5465685679,"$4,073.77",567845676547,"$88,457.21",34589309683'
>>> re.findall(r'"\$((\d+),)*(\d+)(\.\d+)"', data)
[('4,', '4', '073', '.77'), ('88,', '88', '457', '.21')]
>>> re.sub(r'"\$((\d+),)*(\d+)(\.\d+)"', r'\2\3\4', data)
'206360941,5465685679,4073.77,567845676547,88457.21,34589309683'
其思想是获取小数点前后的数据,同时保留小数点。然后,假设第一组与第二组相同,只需替换为除第一组之外的所有组的内容即可。如果有多个逗号,您可能需要更动态的方法


这就是为什么需要这个
(\d+)*
组,它捕获一个子组和逗号。您应该用子组替换整个组。

看起来这就是问题所在。谢谢你。我想过这样做。这可能是一个更好的方法。我会花些时间来练习的,我可以练习一下。
>>> data = '206360941,5465685679,"$4,073.77",567845676547,"$88,457.21",34589309683'
>>> re.findall(r'"\$((\d+),)*(\d+)(\.\d+)"', data)
[('4,', '4', '073', '.77'), ('88,', '88', '457', '.21')]
>>> re.sub(r'"\$((\d+),)*(\d+)(\.\d+)"', r'\2\3\4', data)
'206360941,5465685679,4073.77,567845676547,88457.21,34589309683'