簡體   English   中英

正則表達式 - 如果不匹配則匹配 - Python

[英]Regex - If not match then match this - Python

我為文字的數量道歉,但我無法理解這一點,我想讓我的問題清楚。

我目前正在嘗試創建一個正則表達式來查找網站/電子郵件鏈接的結尾,然后處理其余的地址。 我決定尋找地址的結尾(例如'.com','。org','。net'); 但是,在處理這個問題時,我在兩個方面遇到了困難。 (我選擇了這種方法,因為它最適合當前項目)

首先,我試圖不小心阻止用戶在其中鍵入帶有這些關鍵字的單詞(例如'“org”anisation','試試這個'或g“o to')。 作為一個例子,我如何處理這個正則表達式:

org(?!\\w) - 如果關鍵字后面有字母,則跳過匹配。

第二個問題是找到一個不匹配的地址的額外部分(例如'www.website。“org”.uk')。 為了解決這個問題,作為一個例子,我使用了正則表達式:

org((\\W*|\\.|dot)\\w\\w) - 試圖找到關鍵字后面的前兩個字母,因為大多數擴展只有兩個字母。

主要問題:

為了防止上述兩種情況,我使用的正則表達式類似於:

org(.|dot)\\w\\w|(?!\\w)

但是,我並不像我想在Regex中找到解決方案那樣精通,我理解這不會產生正確的結果。 我知道在Regex中有一種'If this then that'但我似乎無法理解我在這個主題上找到的在線文檔。

如果可能,有人能夠解釋我如何創建一個系統來說:

IF: NOT org(\\w) ELSE IF: org(.|dot) THEN: MATCH org(.|dot)\\w\\w ELSE: MATCH org

我真的很感激有關此事的任何幫助,這已經在我腦海中暫時停留了一段時間。 我只是希望看到它,但我只是沒有所需的知識。

編輯:

正則表達式需要傳遞的測試用例(特別是針對這些示例的'org'正則表達式):

(我在方括號'[]'中標記了匹配項,並且我已標記可能的匹配項被忽略為'<>')

"Hello, please come and check out my website: www.website.[org]"
"I have just uploaded a new game at games.[org.uk]"
"If you would like quote please email me at email@email.[org.ru]"
"I have just made a new <org>anisation website at website.[org], please get in contact at name.name@email.[org.us]"
"For more info check info.[org] <or g>o to info.[org.uk]"

我希望這可以更好地了解Regex需要做什么。

以下正則表達式:

(?i)(?<=\.)org(?:\.[a-z]{2})?\b

應該為你做的工作。

演示:

https://regex101.com/r/8F9qbQ/2/

解釋:

  • (?i)將案例激活為不敏感( .ORG.org
  • (?<=。)強迫有一個. org實際上是一個單詞的一部分時,在org之前避免匹配。
  • org ORGorg
  • (?:...)? 非捕獲組,可以出現01
  • \\.[a-zA-Z]{2}點后跟恰好2個字母
  • \\b字邊界約束

還有一些其他更簡單的方法可以捕獲任何網站,但假設你確實需要這個特征IF: NOT org(\\w) ELSE IF: org(.|dot) THEN: MATCH org(.|dot)\\w\\w ELSE: MATCH org ,然后你可以使用:

org(?!\\w)(\\.\\w\\w)?

它將匹配:的“org.uk” www.domain.org.uk的“組織” www.domain.org

但是不會匹配www.domain.orgzzorgzz

說明: org(?!\\w)組成部分將匹配org是后面沒有字母字符。 它將與orgorg org相匹配org. 但不會與orgzz匹配。

然后,如果我們已經有了org ,我們會嘗試通過添加量詞來匹配其他(\\.\\w\\w) ? 這意味着匹配,如果有,將匹配\\.uk但沒有必要。

只要以'www.'開頭,我就制作了一個捕獲網站的小正則表達式'www.' 接着是一些帶有后續'.'字符'.'

import re 

matcher = re.compile('(www\.\S*\.\S*)') #matches any website with layout www.whatever
string = 'they sky is very blue www.harvard.edu.co see nothing else triggers it, www, org'
match = re.search(matcher, string).group(1)
#output
#'www.harvard.edu.co'

現在你可以根據需要收緊它,以避免誤報。

暫無
暫無

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

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