如何匹配使用正则表达式的段落

时间:2013-09-02 07:50:34

标签: python regex paragraph

我一直在努力使python正则表达式试图匹配文本中的段落,但我没有成功。我需要获得段落的开头和结尾位置。

文字示例:

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
vero eos et accusam et justo duo dolores et ea rebum. 

Stet clita kasd gubergren,
no sea takimata sanctus est Lorem ipsum dolor sit amet.

Ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,
no sea takimata sanctus est Lorem ipsum dolor sit amet.

在这个例子中,我想分别匹配分别以Lorem,Stet和Ipsum开头的所有段落(没有空行)。有谁知道如何做到这一点?

5 个答案:

答案 0 :(得分:4)

您可以像这样拆分双换行符:

paragraphs = re.split(r"\n\n", DATA)

编辑:要将段落捕获为匹配项,以便获取其起点和终点,请执行以下操作:

for match in re.finditer(r'(?s)((?:[^\n][\n]?)+)', DATA):
   print match.start(), match.end()

# Prints:
# 0 214
# 215 298
# 299 589

答案 1 :(得分:2)

使用split是一种方法,你可以使用正则表达式这样做:

paragraphs = re.search('(.+?\n\n|.+?$)',TEXT,re.DOTALL)

.+?是一个惰性匹配,它将匹配使整个正则表达式匹配的最短子串。否则,它将匹配整个字符串。

所以基本上我们想找到一个以空行(.+?)或字符串结尾(\n\n)结尾的字符序列($)。 re.DOTALL标志使点也与换行符匹配(我们还希望匹配由三行组成的段落,而不包含空行)

答案 2 :(得分:0)

换行符号是什么?让我们假设换行符号是'\ r \ n',如果你想匹配以Lorem开头的段落,你可以这样做:

pattern = re.compile('\r\nLorem.*\r\n')
str = '...'    # your source text
matchlist = re.findall(pattern, str)

匹配列表将包含Lorem的所有paragragh开头。而另外两个词是相同的。

答案 3 :(得分:0)

尝试

^(.+?)\n\s*\n

^(.+?)\r\n\s*\r\n

请不要忘记在文字末尾附加额外的新行

答案 4 :(得分:0)

我尝试使用推荐的RegEx和默认的Java RegEx引擎。这给了我好几次StackOverflowException,所以最后我重写了RegEx并对它进行了一些优化。

所以这对我来说在Java中工作正常:

(?s)(.*?[^\:\-\,])(?:$|\n{2,})

这也处理文档的结尾而没有新行,并尝试连接以':',' - '结尾的行。或','到下一段。

为了避免尾随空白(空白或制表符)打破上述功能,我在使用后续正则表达式之前将其剥离:

(?m)[[:blank:]]+$