从 Python 中的字符串列表中删除章节号

Posted

技术标签:

【中文标题】从 Python 中的字符串列表中删除章节号【英文标题】:Remove Chapter number from list of strings in Python 【发布时间】:2018-04-02 15:17:07 【问题描述】:

我正在编写的程序将字符串列表作为输入,并试图删除章节编号。我已经编写了函数,但它当前不起作用。我已经提供了我的函数和输出样本!谢谢!

def remove_chapter(chapter_header):
    for i in range(101):
        chapters="Chapter " + str(i)
        chapter_text=[my_string.replace(chapters,"") for my_string in chapter_header]
    return chapter_text

这里是当前输出不工作的功能: Output

【问题讨论】:

您在for 循环中有一个无条件的return 语句。这通常是一个不好的迹象,因为它将在第一次迭代后退出循环,即在它完成 "Chapter 0" 的替换之后。 我已经进行了编辑,但仍然无法正确读取。 在 for 循环 chapter_text = chapter_header[:] 之前。然后在你的列表理解中迭代chapter_text,而不是chapter_header。并将return 移出循环。 或者只是将整个函数替换为[re.sub(r'Chapter \d+\s*', '', s) for s in chapter_header]。不要忘记import re 【参考方案1】:

由于您的strings 有类似的模式需要删除,但有一些变化(chapter number),最好使用python.re。有了它,您的pattern matching 就有很大的灵活性。

所以,你需要做的就是:

>>> import re
>>> [ re.sub('Chapter \d+ ', '', string) for string in chapter_header ]

#driver 值:

IN : chapter_header = ['Chapter 1 It is ...','However little ...','Chapter 12 Lorem Ipsum']

OUT : ['It is ...', 'However little ...', 'Lorem Ipsum']

分解一下,你的模式看起来像:

'Chapter'<whitespace>[number/s]<whitespace>

因此,只要找到此模式,就会替换该字符串,或者如果未找到,则忽略。

【讨论】:

【参考方案2】:

给定一个章节列表,我们可以删除章节和编号,直到每章的第一个单词。

给定

import itertools as it


chapters = [
    "Chapter 1  It is a truth universally acknowledged ...",
    "Chapter 2  Mr. Bennet was among the earliest ...",
    "Chapter 3  Not all that Mrs. Bennet, however, with ...",
]

代码

pred = lambda x: (x == "Chapter") or x.isdigit() 
results = [list(it.dropwhile(pred, [word for word in chapter.split()])) for chapter in chapters]
results 

输出

[['It', 'is', 'a', 'truth', 'universally', 'acknowledged', '...'],
 ['Mr.', 'Bennet', 'was', 'among', 'the', 'earliest', '...'],
 ['Not', 'all', 'that', 'Mrs.', 'Bennet,', 'however,', 'with', '...']]

详情

列表推导将章节拆分为列表和列表中的单词。等效:

for chapter in chapters:
    print([word for word in chapter.split()])

# ['Chapter', '1', 'It', 'is', 'a', 'truth', 'universally', 'acknowledged', '...']
# ['Chapter', '2', 'Mr.', 'Bennet', 'was', 'among', 'the', 'earliest', '...']
# ['Chapter', '3', 'Not', 'all', 'that', 'Mrs.', 'Bennet,', 'however,', 'with', '...']

最后,itertools.dropwhile 迭代每个列表并删除项目,直到谓词不再为真。换句话说,继续删除第一个既不是"Chapter" 也不是数字的项目。

如果需要,可以将生成的章节重新连接为字符串。

[" ".join(chapter) for chapter in results]
# ['It is a truth universally acknowledged ...',
#  'Mr. Bennet was among the earliest ...',
#  'Not all that Mrs. Bennet, however, with ...']

【讨论】:

以上是关于从 Python 中的字符串列表中删除章节号的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式从python中的列表项中删除子字符串

从熊猫列中删除列表中的单词 - python 2.7

如何从 pyspark 数据框列中的列表中删除特定字符串

从Python中的字符串中删除奇怪的隐藏字符

从字符串列表中删除空字符串

如何删除python列表列表中的''(空字符串)?