[英]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
)
這應該有效:
\brocket(?=[.,]?\s)
它在搜索單詞方面也非常快速(高效)。
你的正則表達式就快到了。
您可以通過檢查后面的內容是空格、后跟換行符/空格的點/逗號或帶有以下正則表達式的字符串結尾的點來確保是否符合您的條件:
(?:^|)rocket(?= |[.,][\n ]|.$)
我猜你可能想設計一些類似於,
(?i)\brocket\b(?!\.[a-z0-9])
並且我們可以使用一些類似的表達式排除在使用交替rocket
后不需要的任何其他內容:
(?i)\brocket\b(?!\.[a-z0-9]|[#-])
該表達式在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可視化正則表達式:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.