使用原始子字符串re.sub替换字符串

时间:2019-01-23 00:30:54

标签: python-3.x

我有一个文本文件。我想删除所有小数点及其尾随数字,除非文本在前面。

例如,应将12,29,14.6,8967.334替换为12,14,8967

例如,不应修改happypants2.3@email.com。

我的代码是:

import re

txt1 = "9.9,8.8,22.2,88.7,morris1.43@email.com,chat22.3@email.com,123.6,6.54"
txt1 = re.sub(r',\d+[.]\d+', r'\d+',txt1)
print(txt1)

除非有更简单的方法来完成此操作,否则如何修改r'\ d +',使其仅返回不带小数位的数字?

2 个答案:

答案 0 :(得分:2)

您需要在正则表达式中使用组。您将数字放在“。”之前。放入括号,然后您可以使用'\1'稍后再引用它们:

txt1 = re.sub(r',(\d+)[.]\d+', r',\1',txt1)

请注意,在您尝试输入的替换代码中,您忘记了替换逗号,因此您的数字将被混在一起。但是,这仍然不是完美的。由于第一个数字不是以逗号开头,因此不会被处理。

代替检查逗号,更好的方法是检查单词边界,这可以使用\b完成。因此解决方案是:

import re

txt1 = "9.9,8.8,22.2,88.7,morris1.43@email.com,chat22.3@email.com,123.6,6.54"
txt1 = re.sub(r'\b(\d+)[.]\d+\b', r'\1',txt1)
print(txt1)

答案 1 :(得分:0)

考虑到这是文件中仅有的两种类型的字符串,您可以显式检查这些条件。

这可能不是一种有效的方法,但是我所做的是拆分str并检查字符串是否包含@email.com。如果是这样,那么我只是追加到新列表中。为了满足您的第一个条件,我们可以将str转换为int,这将消除小数点。

如果您希望所有内容都返回str变量,则可以使用.join()

代码:

txt1 = "9.9,8.8,22.2,88.7,morris1.43@email.com,chat22.3@email.com,123.6,6.54"
txt_list = []
for i in (txt1.split(',')):
    if '@email.com' in i:
        txt_list.append(i)
    else:
        txt_list.append(str(int(float(i))))

txt_new = ",".join(txt_list)
txt_new

输出:

'9,8,22,88,morris1.43@email.com,chat22.3@email.com,123,6'