2014-03-13 66 views
1

我正在練習Magnus Lie Hetland的書「Beginning Python」第二版和第244頁上,他說我的代碼中列出的第一個模式應該產生在這段代碼的底部,但它沒有。所以我嘗試了一些其他模式,以嘗試獲得所需的輸出,但它們也不起作用。我檢查了本書的勘誤表,並且沒有更正此頁面。我使用Python 2.7.6。有什麼建議麼?findall和正則表達式,得到正確的模式

import re 

s1 = 'http://www.python.org http://python.org www.python.org python.org .python.org ww.python.org w.python.org wwww.python.org' 

# choose a pattern and comment out the other two 

# output using Hetland's pattern 
pat = r'(http://)?(www\.)?python\.org' 
''' [('http://', 'www.'), ('http://', ''), ('', 'www.'), ('', ''), ('', ''), ('', ''), ('', ''), ('', 'www.')] ''' 

# output using this pattern 
# pat = r'http://?www\.?python\.org' 
''' ['http://www.python.org'] ''' 

# output using this pattern 
# pat = r'http://?|www\.?|python\.org' 
''' ['http://', 'www.', 'python.org', 'www.', 'http://', 'python.org', 'www.', 'python.org', 'python.org', 'python.org', 'python.org', 'python.org', 'www', 'python.org'] ''' 

print '\n', re.findall(pat, s1) 

# desired output 
''' ['http://www.python.org', 'http://python.org', 'www.python.org', 'python.org'] ''' 
+0

如果它是一個正確編碼的URL,您可以對給定的示例進行拆分,但是我認爲這是針對字符串之類的URL可能出現在文本塊中的任何位置的情況? –

+0

我試圖在所有三種模式上分割,並且它們都沒有工作,並且它將用於像文本塊中任何地方的字符串那樣的url。 –

回答

1

模式工作,如果你做了前兩種可選組非捕獲組(?:...)

pat = r'(?:http://)?(?:www\.)?python\.org' 
matches = re.findall(pat, s1) 
# ['http://www.python.org', 'http://python.org', 'www.python.org', 'python.org', 'python.org', 'python.org', 'python.org', 'www.python.org'] 

也就是說,如果這是所期望的結果 - 作爲變化的格局意味着,只有一個捕獲組而不是三個...

+1

使用Jon的方法,你可以把結果放在一個'set'中去_filter_ out重複。 'print'\ n',set(re.findall(pat,s1))''。 – Drewness

+0

如果我的代碼更改爲此,與所期望的結果有助於: '結果= re.findall(PAT,S1)'' 獨特= []'' 在結果元素:'' 如果元件不獨特:' 'unique.append(element)' 'print unique' –

+1

@Drewness,基本上和我剛剛添加的一樣,當你發佈你的建議時,我的過濾代碼上的格式都是頂起來的即使我沒有這樣發佈。 –