簡體   English   中英

為不一致的URL過濾提高正則表達式的准確性/簡潔性

[英]Improving accuracy/brevity of regex for inconsistent url filtering

因此,對於某些lulz來說,我和一個朋友正在研究過濾一個URL列表(超過100k)以僅檢索父域(例如“ domain.com | org | etc”)的想法。 唯一需要注意的是,它們並不都很好並且在格式上匹配。

因此,要解釋一下,有些可能是“ http://www.domain.com/urlstuff ”,有些則是諸如“ www.domain.co.uk/urlstuff”這樣的國家/地區代碼,而另一些則可能更奇怪,更類似到“ hello.in.con.sistent.urls.com/urlstuff”。

因此,除了故事之外,我還有一個有效的正則表達式:

import re

firsturl = 'www.foobar.com/fizz/buzz'
m = re.search('\w+(?=(\..{3}/|\..{2}\..{2}/))\.(.{3}|.{2}\..{2})', firsturl)

m.group(0)

返回:

foobar.com

它在網址末尾查找第一個“ /”,然后返回兩個“”。 在它之前分隔字段。

因此,我的查詢是,堆棧中的任何人都將有什么智慧可以運用更好/更短的正則表達式,或不依賴於字符串中“ /”的正向查找的正則表達式來解決?

感謝所有的幫助!

我確實認為正則表達式只是解決此問題的正確工具。 正則表達式是模式匹配,在這種情況下,當您知道一個可能具有多個變體的已知模式時,可以充分利用它。

不過,在您對問題的解釋和嘗試的解決方案中,我認為您已經大大簡化了它。 與“ 2位國家/地區代碼”和“ 3位國家/地區代碼”相比,TLD的風格更多。 請參閱ICANN的頂級域名列表,以獲取當前可用的數百個域名 ,長度從2位數起。 另外,您的網址可能沒有任何斜杠,有些域名后面有多個斜杠和點。

所以這是我的解決方案( 請參閱regex101 ):

^(?:https?://)?(?:[^/]+\\.)*([^/]+\\.[az]{2,})

您想要的內容將在第一個匹配組中捕獲。

分解:

  • ^(?:https?://)? 在開始時匹配可能的協議
  • (?:[^/]+\\.)*匹配可能的多個非斜杠序列,每個序列后跟一個點
  • ([^/]+\\.[az]{2,})匹配(並捕獲)一個最終的非斜杠序列,后跟一個點和TLD(2個以上的字母)

您可以改用此正則表達式:

import re
firsturl = 'www.foobar.com/fizz/buzz'
domain = re.match("(.+?)\/", firsturl).group()

但是請注意,這僅在沒有'http://'

暫無
暫無

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

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