首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在文本行中替换这些值

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

Stack Overflow用户
提问于 2019-01-31 22:21:04
回答 4查看 57关注 0票数 0

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

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

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

我使用正则表达式去掉了美元符号和引号--

代码语言:javascript
运行
复制
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]的列表

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-01-31 22:31:30

这似乎起作用了:

代码语言:javascript
运行
复制
>>> 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+),)*组,它捕获子组和逗号。您应该将整个组替换为子组。

票数 1
EN

Stack Overflow用户

发布于 2019-01-31 22:26:49

我建议使用csv.reader (或csv.DictReader,如果您想对每一列进行其他处理)来读取文件,因为这将自动解析每一列。一旦读取了文件,就可以对每一列执行正则表达式,这样就不需要自己拆分行了。我相信,csv.reader的默认delimiterquotechar是您需要的。

票数 0
EN

Stack Overflow用户

发布于 2019-01-31 22:26:54

你试过locale模块了吗?与在How do I use Python to convert a string to a number if it has commas in it as thousands separators?中一样,它将比正则表达式更容易。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54462607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档