从fi中删除未混合的数字

2024-05-21 05:22:18 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个叫做输入.txt看起来像这样

I listened to 4 u2 albums today
meet me at 5
squad 4ever

我想过滤掉独立的数字,所以“4”和“5”应该去掉,但“u2”和“4ever”应该保持不变。i、 e输出应为

I listened to u2 albums today
meet me at
squad 4ever

我一直在尝试使用这个代码

for line in fileinput.input("input.txt", inplace=True):
    new_s = ""
    for word in line.split(' '):
        if not all(char.isdigit() for char in word):
            new_s += word
            new_s += ' '
    print(new_s, end='')

这与我在这里找到的代码非常相似:Removing numbers mixed with letters from string

但是我得到的不是想要的结果

I listened to u2 albums today
 meet me at 5
 squad 4ever 

正如你所看到的,这里有两个问题,第一,只有第一行丢失了我想要丢失的数字,“5”仍然存在于第二行。第二个问题是新行开头的多余空格。你知道吗

我已经在代码上玩了一段时间,浏览了stackoverflow,但是找不到问题出在哪里。有什么见解吗?你知道吗


Tags: to代码intxtnewfortodayat
3条回答

只需使用regexp。你知道吗

re.sub(r"\b\d+\b", "", input)

匹配单词边界之间的任何数字

或避免双重空间:

re.sub(r"\s\d+\s", " ", input)

str.split(' ')不会从每一行中删除后面的换行符。他们最后连到最后一句话。所以对于第一个问题,'5'不会被删除,因为它实际上是'5\n',而\n不是一个数字。你知道吗

第二个问题是相关的。当你打印每行的最后一个单词时,它包含了那条换行符,而且你在结尾加了一个空格。该空格显示为下一行的第一个字符。你知道吗

最简单的解决方案就是将line.split(' ')更改为line.split()。如果没有任何参数,split()将删除所有空格,包括换行符。您还需要从print中删除end='',以便将换行添加回。你知道吗

您可以使用正则表达式:

data = open('file.txt').read()
import re
data = re.sub('(?<=\s)\d+(?=$)|(?<=^)\d+(?<=\s)|(\s\d+\s)', '', data)

输出:

I listened tou2 albums today
meet me at
squad 4ever

相关问题 更多 >