2014-03-13 40 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,基本上和我刚刚添加的一样,当你发布你的建议时,我的过滤代码上的格式都是顶起来的即使我没有这样发布。 –