2010-03-10 44 views
1

我需要一個正則表達式,這將使我從每個例子的結果如下,我似乎無法得到它的權利:正則表達式的子域,讓`wwwboys.domain.com`

example.com收益率 - >什麼/空

www.example.com收益率 - >什麼/空

account.example.com收益率 - >account

mywww.example.com收益率 - >mywww

wwwboys.example.com收益率 - >wwwboys

cool-www.example.com收益率 - >cool-www

所以,這並不重要,如果他們的子域中使用的 'www',但它不能只是 'WWW'。它也可以包含連字符。

+0

什麼語言?和'cool-www.example.com'應該產生'cool-www'吧? – ghostdog74 2010-03-10 04:26:36

+0

Python是我正在使用的。 – orokusaki 2010-03-10 04:27:03

+0

@ ghostdog74是的,沒錯。現在編輯。 – orokusaki 2010-03-10 04:27:21

回答

1
mystrings=""" 
example.com 
www.example.com 
account.example.com 
mywww.example.com 
wwwboys.example.com 
cool-www.example.com 
""" 

junk=["example.com","www.example.com"] 
for url in mystrings.split("\n"): 
    if url and not url.strip() in junk: 
     print "-->",url.split(".",2)[0] 

輸出

$ ./python.py 
--> account 
--> mywww 
--> wwwboys 
--> cool-www 
+0

@ ghostdog74 +1哇,所以不需要重新模塊?謝謝。 – orokusaki 2010-03-10 04:35:17

+0

@ ghostdog74第二個想法,那樣更好。現在我可以通過配置設置來添加更多默認的不允許的子域(比如'api.example.com'等)。 – orokusaki 2010-03-10 04:36:38

+0

對於其他輸入(例如「www.google.com」或「www.stackoverflow.com」),由於它並未真正檢查子域是否爲「www」,因此失敗。 – 2010-03-10 04:57:45

1
x="""example.com yields -> nothing/empty 

www.example.com yields -> nothing/empty 

account.example.com yields -> account 

mywww.example.com yields -> mywww 

wwwboys.example.com yields -> wwwboys 

cool-www.example.com yields -> cool-www""" 

>>> re.findall("^([A-Za-z0-9-]+)\.(?<!^www\.)[A-Za-z0-9-]+\.[A-Za-z]+",x,re.MULTILINE) 
['account', 'mywww', 'wwwboys', 'cool-www'] 
0

這裏是基於ghostdog74的例子我的解決方案:

OFF_LIMITS = ('api', 'www', 'secure', 'account') 

def get_safe_subdomain_or_none(host): 
    subdomain = None 
    L = host.split('.') 
    if len(L) is 3 and not L[0] in OFF_LIMITS: # 3 ensures that you don't have a sub-sub domain, and that you don't have just `example.com` 
     subdomain = L[0] 
    return subdomain 
+0

使用==而不是*用數字*。關於「www.blah.example.com」呢? – 2010-03-10 05:54:51

+0

@Roger對於www.blah.example.com,它會返回None,但我可以對其進行修改以整理子子域。另外,我只使用'is'而不是'==',因爲'is'有點像'===',我知道它需要完全是'3'。這是因爲深奧的風格原因在Python世界中皺起了眉頭還是它是不好的做法?無論哪種方式,我都可以改變它。 – orokusaki 2010-03-10 17:07:40

+0

我問過www.blah ...因爲我不清楚在這種情況下你想要什麼樣的行爲。 *是*不像===; *是*檢查對象標識,而===(用其他語言)檢查值和類型。你將幾乎完全使用* is *,無與類似單例。 – 2010-03-11 05:39:51