Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在特定模式之前从字符串中提取_Python_Regex - Fatal编程技术网

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

Python 在特定模式之前从字符串中提取,python,regex,Python,Regex,我试图删掉德语维基百科文章,只输出传记文本数据(删掉所有文献、书单等)。因此,文本的示例可以如下所示: 一些相关文本==标题1==更多相关文本===标题2==和 更相关的文本==关于个人的一些文献==不需要的文本 ==作者的书==更多不需要的文本 问题是在模式==[文本包括单词文学或书籍]==之前输出文本。这就是: 一些相关文本==标题1==更多相关文本===标题2==和 更相关的文本 我正在使用Python3,我尝试了一些类似这样的正则表达式(还有更多): 但是,不幸的是,这将只输出文本,直到

我试图删掉德语维基百科文章,只输出传记文本数据(删掉所有文献、书单等)。因此,文本的示例可以如下所示:

一些相关文本==标题1==更多相关文本===标题2==和 更相关的文本==关于个人的一些文献==不需要的文本 ==作者的书==更多不需要的文本

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

一些相关文本==标题1==更多相关文本===标题2==和 更相关的文本

我正在使用Python3,我尝试了一些类似这样的正则表达式(还有更多):

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

一些相关文本

我怎样才能使它敏感地捕捉到第一种模式,这种模式本身就有“文学”或“书籍”

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


顺便说一句,没有办法区分标题1和标题2,因为它们有时差异太大,而且不清楚,所以我试图区分清楚标记传记文本结尾的标题,例如文学或书籍。

这里是纯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

下面是一个纯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

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

+?(?=={2,3}[^=]*文献)

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()))
输出:

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:某些相关文本==标题1==更多 相关文本===标题2===和更相关的文本


.

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

+?(?=={2,3}[^=]*文献)

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()))
输出:

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:某些相关文本==标题1==更多 相关文本===标题2===和更相关的文本


.

是否保证“文献”一词会出现?如果你发布一个你试图匹配的真实内容的示例,可能会更有帮助。甚至可以发布这些文章的链接。如果您解释如何获取要解析的内容,也可能会有所帮助。例如,如果您接收的原始内容是html/xml/等,那么使用解析器可能更容易。单词
“文学”
是否保证存在?如果您发布一个您试图匹配的真实内容的示例,可能会更有帮助。甚至可以发布这些文章的链接。如果您解释如何获取要解析的内容,也可能会有所帮助。例如,如果您接收的原始内容是html/xml/等,那么使用解析器可能会更容易。非常感谢。看起来不错。但是,当例如“文学”不是“==标题1==”的一部分,而是后续文本的一部分时,表达式失败,例如“这里有一些文本==标题1==更多的文学文本。==标题2,文学==”。在这里,它会在“==Title1”之后立即剪切它,而不考虑以下文本,并在“==Title2处剪切文学==”假设的输出应该是:“这里有一些文本==Title1==更多的文学文本”,如果您只想在最新的“文学”之前剪切,那么就让它贪婪(即,从上面的模式中删除
)。下面是一个演示:很抱歉回复太晚。再次感谢您的帮助。但它仍然不起作用。我的问题不是在第一个或最新的“文献”之前剪切它。它在例如“==文献==”的第一次出现之前。正则表达式在等号之间查找单词文学(或其他单词)是很有说服力的。稍后,我还想在列表中添加其他单词,不仅是文学,还有书籍、作者……等等。并找到“==文学或书籍或作者==”的第一次出现然后在前面剪切文本。希望能澄清。@MikeTwain你在问题中没有说得很清楚,但无论如何,如果你想从字符串的开头开始匹配,并在第一个
=
后面跟这些单词的前面剪切,你可以使用
^.+(?=={2,3}[^=]*(?:文学|书籍|作者|随便什么))
。这是一个演示:非常感谢。这看起来很不错。但是,当例如“文学”不是“==标题1==”的一部分,而是后续文本的一部分时,表达式失败了,例如“这里有一些文本==标题1==更多包含文学的文本。==标题2包含文学==”。这里它会在“==标题1”之后立即剪切它考虑到以下文本,并在“==Title2 with literature==”处剪切,假设的输出应该是:“这里有一些文本==Title1==更多的文本with literature”,如果您只想在最新的“literature”之前剪切,则使其贪婪(即,从上面的模式中删除
)。这是一个演示:很抱歉回复太晚。再次感谢您的帮助。但它仍然不起作用。我的问题不是在第一个或最新的“文学作品”之前将其删除。它是在例如“==文学作品==”的第一次出现之前。正则表达式查找文学(或其他单词)这个词是令人信服的在等号之间。之后我想在列表中添加其他单词,不仅是文学,还有书籍、作者……等等。找到“==文学或书籍或作者==”的第一个外观,然后在前面剪切文本。希望澄清。@MikeTwain Yo