我正在尝试剪切德语维基百科的文章,仅输出传记文本数据(剪切掉所有文献,书目等)。因此,“文本”示例如下所示:
一些相关文本== 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 ==:
一些相关的文字
我如何敏感地捕获第一个内部具有“文学”或“书籍”的图案?
我希望我可以准确地描述问题。在此先感谢您的帮助,如果在之前提出过此问题,对不起,我在任何地方都找不到解决方案。
顺便说一句,它无法区分标题1和标题2有时彼此之间太不同且不清楚,所以我试图区分清楚地标明了传记文学(例如文学或书籍)结尾的标题。
答案 0 :(得分:1)
这是纯Python方式。这会拆分'='
上的文本,并在每个拆分中检查单词。如果找到匹配项,我们将打破循环并加入所有循环:
s = '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'
lst = []
for x in s.split('='):
if 'literature' in x:
break
else:
lst.append(x)
print('='.join(lst).strip('='))
# some relevant text == Title1 == more relevant text ===Title2=== and more relevant text
答案 1 :(得分:1)
如果我正确理解您的要求,则以下正则表达式将为您工作:
.+?(?=={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()))
输出:
匹配1在0-87被发现:一些相关的文字== Title1 ==更多 相关文字===标题2 ===和更多相关文字