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

问题描述 投票:6回答:5

我一直在尝试用python regex匹配文本中的段落,但是我没有成功。我需要获取这些段落的开始和结束位置。

文本示例:

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开头的段落(没有空行)。有谁知道如何做到这一点?

python regex paragraph
5个回答
5
投票

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

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

2
投票

使用拆分是一种方法,您也可以使用正则表达式来做到这一点:

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

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

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


0
投票

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

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

匹配列表将包含以Lorem开头的所有参数。并且其他两个词是相同的。


0
投票

尝试

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

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

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


0
投票

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

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

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

这还将处理文档的末尾而没有新行,并尝试将以':','-'或','结尾的行合并到下一段。

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

(?m)[[:blank:]]+$
© www.soinside.com 2019 - 2024. All rights reserved.