繁体   English   中英

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

[英]How to replace these values in lines of text

我有几行文字。 第一行是标题行,随后的每一行代表数据字段,每个值都用逗号分隔。 每行中包含一到三个美元值,范围从个位数美元值($ 4.50)到三位数($ 100,000.34)。 它们也被引号包围。

206360941,5465685679,"$4,073.77",567845676547,"$88,457.21",34589309683

我需要消除货币价值的引号和美元符号以及内部的逗号。 需要保留小数点的句点分隔符,因此“ $ 6,801.56”变为6801.56

我已经使用正则表达式消除了美元符号和引号-

with open("datafile.csv", "r") as file:
    data = file.readlines()

for i in data:
    i = re.sub('[$"]', '', i)

这会使数据看起来像7545245,6,801.56,3545647因此如果我用逗号分开,则会将较大的值一分为二。

['206360941,5465685679,4,073.77,567845676547,88,457.21,34589309683']

我曾考虑过用引号拆分,进行更多的正则表达式并使用.join()重新加入,但事实证明,只有带逗号的货币值包含引号,没有逗号的较小值不包含引号。

另外,我知道我可以使用re.findall(r'\\$\\d{1,3}\\,\\d\\d\\d\\.\\d\\d', i)绘制数字格式(如果我打印的话)它将输出类似[$100,351.35]的列表

我只是不确定那之后该怎么办。

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

您是否尝试过模块locale 如“ 如何使用Python将字符串转换为数字(如果其中包含逗号作为数千个分隔符)一样? 比正则表达式容易。

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

伪代码可能如下所示:

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+),)*组,它捕获一个子组和逗号。 您应将整个组替换为子组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM