首页 > 解决方案 > 从特定模式之前的字符串中提取

问题描述

我正在尝试删减德语维基百科文章,只输出传记文本数据(删去所有文学作品、书单等)。因此,文本的示例可能如下所示:

一些相关文本 == Title1 == 更多相关文本 ===Title2=== 和更多相关文本 == 一些关于人物的文献 == 不需要的文本 == 作者的书籍 == 更多不需要的文本...

问题是在 ==[包括单词文学或书籍的文本]== 模式之前输出文本。这将是:

一些相关文本 == Title1 == 更多相关文本 ===Title2=== 和更多相关文本

我正在使用 Python 3,我尝试了一些这样的正则表达式(以及更多):

seperator = re.compile(r'={2,3}\s?.*literature.*\s?={2,3}')
m = seperator.search(text)
print (text[:m.start()])

但是,不幸的是,这只会输出文本,直到第一个模式 == Title1 ==:

一些相关的文字

我怎样才能让它敏感地捕捉到第一个具有“文学”或“书籍”的模式?

我希望我能准确地描述这个问题。提前感谢您的帮助,如果之前有人问过这个问题,我很抱歉,我在任何地方都找不到解决方案。

顺便说一句,它无法区分 Title1 和 Title2,因为它们有时过于不同且不清楚,所以我试图区分清楚地标记传记文本结束的标题,例如文学或书籍。

标签: pythonregex

解决方案


如果我正确理解您的要求,以下正则表达式应该适合您:

.+?(?=={2,3}[^=]*literature)

正则表达式演示

Python 3 示例:

import re

regex = r".+?(?=={2,3}[^=]*literature)"
test_str = "some relevant text == Title1 == more relevant text ===Title2=== and more relevant text == some literature on person == unwanted text ==books by the author== more unwanted text..."

matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

输出:

在 0-87 找到匹配 1:一些相关文本 == Title1 == 更相关文本 ===Title2=== 和更相关文本

Python 演示


推荐阅读