从字符串列表中删除不需要的字符

时间:2016-03-07 21:59:20

标签: python list strip

我有一个名为file_contents的字符串列表。 列表中的每个项目都以此格式的数字继续:#1。 #2。等等.. 我想从列表中的每个项目中删除它们。

for item in range(len(file_contents)):
    file_contents[item].lstrip('#' + [item] + ". ")

所以,我想将"#1. Apples"变成"Apples"

有什么建议吗?

当我运行此操作时,我收到以下错误:

TypeError: Can't convert 'list' object to str implicitly

这是我定义的整个方法:

def read_from_file(self, filename):
        """Checks if file exists, if it does, reads it in and creates new List object."""
        file_contents = []
        fileExists = os.path.isfile(filename)
        if not fileExists:
            print(filename, "does not exist.")
        else:
            with open(filename) as file:
                file_contents = [line.strip() for line in file]

        for item in range(len(file_contents)):
            file_contents[item] = file_contents[item].lstrip('#' + str(item) + ". ")

        list_name = file_contents[0]
        list_contents = []
        for item in file_contents:
            if item in list_name:
                continue
            else:
                list_contents.append(item)

        new_list = List(list_name)
        new_list.contents = list_contents

        return new_list

3 个答案:

答案 0 :(得分:4)

Regular expressions非常适合:

import re
pattern = re.compile(r'#\d+\.\s*')
new_contents = [pattern.sub('', item) for item in file_contents]

我建议您阅读doc链接,了解正则表达式的工作原理,但对模式进行简要说明:

  • # - 寻找#字符
  • \d+ - 后跟一个或多个数字
  • \. - 然后是一个点字符
  • \s* - 然后是任意数量的空白

re.sub查找该模式,然后将其替换为'',一个空字符串 - 从而将其删除。

您也非常误解lstrip和Python语法的常用方式:

  1. 它不会修改您调用它的字符串,它会返回一个新字符串。
  2. [item]只会是[0][1]等,这就是为什么您无法将其连接到字符串的原因。我不太确定你在那里努力实现的目标。

答案 1 :(得分:0)

我认为你打算做的是

stripped_contents = []
with open('test.data') as f:
    for i, line in enumerate(f):
        strip = '#' + str(i + 1) + ". "
        stripped_line = line.lstrip(strip)
        stripped_contents.append(stripped_line)

print stripped_contents

即。您需要将项目转换为字符串而不是列表。另外,因为它从0开始,你需要项目+1。

另一种解决方案可能是

stripped_contents = []
with open('test.data') as f:
    for i, line in enumerate(f):
        start_pos = len('#' + str(i + 1) + ". ")
        stripped_line = line[start_pos:]
        stripped_contents.append(stripped_line)

print stripped_contents

正则表达式也可以。但对于这样一个简单的问题感到过于复杂。

答案 2 :(得分:0)

如果你没有想要从左边剥去所有字符到lstrip:

def read_from_file(self, filename):
        """Checks if file exists, if it does, reads it in and creates new List object."""
        file_contents = []
        fileExists = os.path.isfile(filename)
        if not fileExists:
            return (filename, "does not exist.")
        with open(filename) as file:
            file_contents = [line.lstrip("0123456789.").strip() for line in file]

您正在移除换行符,因此您只需调用strip,之后将删除换行符和行距空间:

In [14]: "#123. 1foo".lstrip("0123456789#.").strip()
Out[14]: '1foo'