我目前正在嘗試根據它們包含的單詞及其順序來匹配特定的句子。我主要使用基于此結構的前瞻斷言來執行此操作:
[^>.\]]*(?="The desired Words)[^<.\]]*
因此,例如,我正在尋找談論馬爾代夫假期的句子。為了匹配這句話:我會預訂去馬爾代夫度假。我可以查找包含單詞vacation 和之后的maledives 的句子。
[^>.\]]*(?=([Vv]cation.*[Mm]aledives))[^<.\]]*
使用的表達.*
會導致問題,因為“Maledives”這個詞也可以出現在后面的句子中(示例錯誤)
我的解決方案是使用運算式([,'`′() \\]*\w ){0,X}\s*
而不是.*
,表示“Maledives”必須在相同的句子中跟隨“假期”并且它們之間最多有 X 個單詞,更改為這種結構:
[^>.\]]*(?=([Vv]cation([,'`′() \\]*\w ){0,X}\s*[Mm]aledives))[^<.\]]*
(示例正確)
不幸的是,這個運算式的計算量非常大,如果 {0,X} 的范圍設定為高,則會導致災難性的回溯。
您還有其他建議如何按順序查找包含特定單詞的句子嗎?
uj5u.com熱心網友回復:
你可以嘗試這樣的事情。
(?:^|\.)\s*([^.]*[Vv]acation[^.]*[Mm]aledives[^.]*(?:\.|$))
見演示。
https://regex101.com/r/97UvCH/1
無需前瞻。它會減慢速度。
uj5u.com熱心網友回復:
您的模式很容易發生災難性的回溯,因為在{0,3}
重復部分有嵌套的量詞,并且在模式的開頭也有前導的可選量詞。
Pythonre
不支持所有格量??詞或原子組,但您可以在前瞻斷言中模擬使用捕獲組,然后在第一部分的斷言為真時使用對該組的反向參考以減少回溯。
但是帶有量詞的第二部分{0,200}
不應該是原子的,因為您希望在匹配maledives之前允許回溯以適應可變數量的單詞。
因此,量詞的數字越大,探索的可能路徑就越多。
(?<!\S)(?=([^<>.\]]*[Vv]acation\b))\1(?:[,'`′() \\] \w ){0,200}\s*[Mm]aledives\b[^<.\]]*
模式匹配:
(?<!\S)
在左側斷言空白邊界(?=
積極的前瞻斷言,斷言右邊是什么(
捕獲組 1[^<>.\]]*[Vv]acation\b
匹配列出以外的可選字符,然后匹配假期后跟單詞邊界
)
關閉組 1
)
關閉前瞻\1
將反向參考匹配到組 1(在前瞻中匹配)(?:[,'`′() \\] \w ){0,200}
重復 0-n 次字符類中的一個或多個字符,然后重復 1 個單詞字符\s*[Mm]aledives
匹配可選的空白字符,然后匹配maledives[^<.\]]*
可選匹配除字符類中列出的任何字符
查看正則運算式演示。
(?>
另一種選擇可能是在第一部分使用帶有原子組的 PyPi 正則運算式模塊:
(?<!\S)(?>[^<>.\]]*[Vv]acation\b)(?:[,'`′() \\] \w ){0,3}\s*[Mm]aledives[^<.\]]*
查看Python 演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/496181.html