簡體   English   中英

如何使用正則表達式匹配段落

[英]How to match a paragraph using regex

我一直在努力使用 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 開頭的所有段落(不包括空行)。 有誰知道如何做到這一點?

您可以像這樣在雙換行符上拆分:

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

使用 split 是一種方法,您也可以像這樣使用正則表達式:

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

.+? 是一個惰性匹配,它將匹配使整個正則表達式匹配的最短子字符串。 否則,它將只匹配整個字符串。

所以基本上在這里我們想要找到一個以空行( \n\n )或字符串結尾( $ )結尾的字符序列( .+? )。 re.DOTALL標志使點也匹配換行符(我們還希望匹配由三行組成的段落,其中沒有空行)

嘗試

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

或者

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

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

我嘗試將推薦的 RegEx 與默認的 Java RegEx 引擎一起使用。 這給了我幾次 StackOverflowException,所以最后我重寫了 RegEx 並對其進行了更多優化。

所以這在Java中對我來說很好用:

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

這也處理沒有新行的文檔結尾,並嘗試將以 ':'、'-' 或 ',' 結尾的行連接到下一段。

並且為了避免尾隨空格(空格或制表符)破壞上述功能,我在使用以下正則表達式之前將它們剝離:

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

以下正則表達式:

\w*\s*|\w|\D

完美匹配這些段落:

23歲半的棕狐,跳過懶狗! 這只狗毛茸茸的,但並不可愛,他的鯔魚又油又黑。

第二天,狗跳過了狐狸——但狐狸不喜歡(或者他不喜歡)。

您可以在https://regex101.com/r/Bvyuaq/1進行測試

什么是換行符? 讓我們假設換行符是'\r\n',如果你想匹配以Lorem開頭的段落,你可以這樣做:

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

匹配列表將包含所有以 Lorem 開頭的段落。 另外兩個詞是一樣的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM