Python 3.x 重新使用原始子字符串替换字符串

Python 3.x 重新使用原始子字符串替换字符串,python-3.x,Python 3.x,我有一个文本文件。我想删除所有小数点及其尾随数字,除非前面有文本 e、 g 12.29,14.68967.334应替换为12,148967 e、 g快乐的人2。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) 除非有

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

e、 g 12.29,14.68967.334应替换为12,148967

e、 g快乐的人2。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+,使其只返回数字而不带小数点?

您需要使用正则表达式中的组。将“.”前面的数字放在括号中,然后可以使用
“\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)

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

这可能不是一种有效的方法,但我所做的是拆分
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'
输出:

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'