从文件中删除非混合数字

4
假设我有一个名为input.txt的文件,内容如下:
I listened to 4 u2 albums today
meet me at 5
squad 4ever

我希望过滤掉单独的数字,因此"4"和"5"应该被去除,但是"u2"和"4ever"应该保留,即输出应该为:
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='')

这与我在这里找到的代码非常相似:从字符串中删除混合数字和字母

但是,我得到的输出不是想要的。

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

正如您所看到的,这里有两个问题,首先只有第一行失去了我想要丢弃的数字,“5”仍然存在于第二行。第二个问题是在新行开头的额外空格。
我已经玩弄了代码一段时间并浏览了stackoverflow,但找不到问题出现的地方。有什么见解吗?

问题在于行末的最后一个单词以\n结尾。这不是数字,因此它通过了if语句的判断,而额外的空格是因为您在for循环中每次都添加了一个空格,包括行末的最后一个单词。 - yinnonsanders
3个回答

3

str.split(' ') 不会从每行末尾删除换行符,它们会附加到该行的最后一个单词上。所以对于你的第一个问题,'5' 没有被删除,因为它实际上是 '5\n',而 \n 不是数字。

第二个问题与此相关。当您打印每行的最后一个单词时,它包含该换行符,再加上您在末尾添加的空格。该空格显示为下一行的第一个字符。

最简单的解决方案是将 line.split(' ') 更改为 line.split()。没有任何参数,split() 将删除所有空格,包括换行符。您还需要从您的 print 中删除 end='',这样换行符就会被添加回来。


1
每行末尾(换行符之前)还会添加一个额外的空格,可能需要使用print(new_s[:-1])来处理。 - yinnonsanders
1
通过将每行的单词存储在列表中并执行' '.join(),或者可以实现。 @yinnonsanders - glibdud

1
只需使用正则表达式。
re.sub(r"\b\d+\b", "", input)

匹配单词边界内的任何数字

或者避免双空格:

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

那种方法可以运行,但是当替换数字时会留下一个空白,这会将“我今天听了4张U2专辑”变成“我今天听了 U2专辑”,在“to”和“U2”之间有2个空格。 有什么办法可以解决这个问题吗? - Skum
已编辑并解决方案。 - fievel

0

你可以使用正则表达式:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接