findall和正则表达式,获得正确的模式

时间:2014-03-13 18:35:34

标签: python regex python-2.7 findall

我正在研究Magnus Lie Hetland的书“Beginning Python”第2版,在第244页他说我的代码中列出的第一个模式应该产生列出在此代码底部的所需输出,但它没有“T。所以我尝试了其他几种模式以尝试获得所需的输出,但它们也不起作用。我检查了该书的勘误表,此页面没有更正。我正在使用python 2.7.6。有什么建议吗?

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'] '''

1 个答案:

答案 0 :(得分: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']

也就是说,如果这是预期的结果 - 因为对模式的更改意味着只有一个捕获组而不是三个...