从文件

时间:2017-11-15 14:46:54

标签: python python-3.x python-3.5

假设我有一个名为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='')

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

但不是我想要的输出

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

正如你所看到的,这里有两个问题,首先只有第一行丢失我希望它丢失的数字," 5"仍然存在于第二行。第二个问题是新行开头的额外空格。

我一直在玩代码并浏览堆栈溢出,但无法找到问题的来源。任何见解?

3 个答案:

答案 0 :(得分:3)

str.split(' ')不会删除每行的尾随换行符。他们最终依附于该行的最后一个字。因此,对于您的第一个问题,'5'没有被删除,因为它实际上是'5\n'\n不是数字。

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

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

答案 1 :(得分:1)

只需使用正则表达式。

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

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

或者避免双倍空格:

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

答案 2 :(得分: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