簡體   English   中英

如何將正則表達式匹配限制為精確的子字符串,但某些字符除外,只要它們后跟一個空格或換行符?

[英]How do I constrict regex matches to exact substrings with the exception of certain characters as long as they are followed by a space or new line?

假設我們有字符串:

火箭將前往火星。 是的,火箭。\\n 關注我們的 Rocket.mars.com 了解有關我們火箭的信息。\\n PS 我們為這枚火箭而生,所有人都為這輝煌的火箭歡呼。

我想匹配子串rocket 但是,只匹配粗體:

火箭將前往火星。 是的,火箭。\\n 關注我們的 Rocket.mars.com,了解有關我們火箭的信息。 \\n PS 我們為這枚火箭而生,都為這光榮的火箭歡呼。

我最接近編寫執行此操作所需的正則表達式的是(提示 - 它不起作用):

(?:^|)rocket(?:$|)

正則表達式應將匹配限制為:

  • 匹配的子串不是較大詞的子串
    • 因此rockets不匹配
  • 子字符串后面可以跟一個空格 它也可以后跟一個點或逗號只有當接下來要么是空白 ) 或換行符( \\n )
    • 我們不匹配Rocket.mars.com中的火箭,因為它不滿足條件的第二部分

這應該有效:

\brocket(?=[.,]?\s)

它在搜索單詞方面也非常快速(高效)。

你的正則表達式就快到了。

您可以通過檢查后面的內容是空格、后跟換行符/空格的點/逗號或帶有以下正則表達式的字符串結尾的點來確保是否符合您的條件:

(?:^|)rocket(?= |[.,][\n ]|.$)

我猜你可能想設計一些類似於,

(?i)\brocket\b(?!\.[a-z0-9])

演示 1

並且我們可以使用一些類似的表達式排除在使用交替rocket后不需要的任何其他內容:

(?i)\brocket\b(?!\.[a-z0-9]|[#-])

演示 2

該表達式在regex101.com 的右上角面板中進行了解釋,如果您希望探索/簡化/修改它,並且在此鏈接中,您可以觀看它如何與某些示例輸入匹配,如果您願意的話。

測試

import re

regex = r"(?i)\brocket\b(?!\.[a-z0-9]|[#-])"
test_str = "The rocket, is going to Mars. Yes, the rocket.\\n Follow us at rocket.mars.com for info about our rockets. \\n P.S. We live for this rocket,all hail the glorious rocket. rocket;rocket,rocket:rocket.1:rocket.c #rocket# rocket-science"

print(re.findall(regex, test_str))

正則表達式電路

jex.im可視化正則表達式:

在此處輸入圖片說明

您可能會匹配前面有單詞邊界的火箭。 使用正向前瞻來斷言右邊是空格或點/逗號,后跟 () 或空白字符。

\brocket(?= |[.,](?=[()\s]))

正則表達式演示

暫無
暫無

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

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