12

如何提取所有字符(包括换行符),直到第一次出现给出的单词序列?例如使用以下输入:

输入文本:

"shantaram is an amazing novel.
It is one of the best novels i have read.
the novel is written by gregory david roberts.
He is an australian"

the 而我想从中提取文本shantaram到第一次出现的序列the在第二行。

输出必须是 -

shantaram is an amazing novel.
It is one of the

我整个上午都在努力。我可以编写表达式来提取所有字符,直到遇到特定字符,但如果我使用如下表达式:

re.search("shantaram[\s\S]*the", string)

它与换行符不匹配。

4

3 回答 3

26

您想使用该DOTALL选项来匹配换行符。来自doc.python.org

re.DOTALL

制作“。” 特殊字符完全匹配任何字符,包括换行符;没有这个标志,'.' 将匹配除换行符以外的任何内容。

演示:

In [1]: import re

In [2]: s="""shantaram is an amazing novel.
It is one of the best novels i have read.
the novel is written by gregory david roberts.
He is an australian"""

In [3]: print re.findall('^.*?the',s,re.DOTALL)[0]
shantaram is an amazing novel.
It is one of the
于 2013-09-22T11:13:19.890 回答
6

使用这个正则表达式,

re.search("shantaram[\s\S]*?the", string)

代替

re.search("shantaram[\s\S]*the", string)

唯一的区别是“?”。通过使用'?'(例如*?、+?),您可以防止最长匹配。

于 2013-09-22T11:49:17.410 回答
1

不使用正则表达式的解决方案:

from itertools import takewhile
def upto(a_string, stop):
    return " ".join(takewhile(lambda x: x != stop and x != "\n".format(stop), a_string))
于 2013-09-22T11:24:02.033 回答