从特定模式之前的字符串中提取

时间:2019-04-28 15:51:16

标签: python regex

我正在尝试剪切德语维基百科的文章,仅输出传记文本数据(剪切掉所有文献,书目等)。因此,“文本”示例如下所示:

  

一些相关文本== 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有时彼此之间太不同且不清楚,所以我试图区分清楚地标明了传记文学(例如文学或书籍)结尾的标题。

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)

Regex demo

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 ===和更多相关文字

Python demo