10

我一直在努力使用 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 开头的所有段落(不包括空行)。有谁知道如何做到这一点?

4

5 回答 5

8

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

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
于 2013-09-02T07:54:50.177 回答
2

使用 split 是一种方法,您也可以像这样使用正则表达式:

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

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

所以基本上在这里我们想要找到以.+?空行(\n\n)或字符串结尾()结尾的字符序列($)。该re.DOTALL标志也使点匹配换行符(我们还希望匹配由三行组成的段落,其中没有空行)

于 2013-09-02T08:11:36.377 回答
0

我尝试将推荐的 RegEx 与默认的 Java RegEx 引擎一起使用。这给了我几次 StackOverflowException,所以最后我重写了 RegEx 并对其进行了更多优化。

所以这在Java中对我来说很好用:

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

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

并且为了避免尾随空格(空格或制表符)破坏上述功能,我在使用以下正则表达式之前将它们剥离:

(?m)[[:blank:]]+$
于 2014-08-06T12:00:48.080 回答
0

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

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

匹配列表将包含所有以 Lorem 开头的段落。另外两个词是一样的。

于 2013-09-02T08:36:33.820 回答
0

尝试

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

或者

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

只是不要忘记在文本末尾附加额外的新行

于 2014-02-01T13:45:52.163 回答