re模块包含正则表达式的支持,这个功能很有用,所以单独拿出来
正则表达式的学习中,每次只需根据自己的需要一次只学一点,不必一次性全部掌握
除了标准文档外,http://amk.ca/python/howto/regex/ 也是这方面的有用资源
在re模块的函数中可以使用VERBOSE标志,即加入一个re.VERBOSE作为参数
它允许在模式中添加空白(空格、tab、换行符等),当需要使用空白符时再用反斜杠进行转义,也可以使用#注释
import re
re.split('o(xx)', 'foobar|foxxbar|foxxoxxbar')
re.findall('[a-zA-Z]+', '"Hm...Err -- are you sure?" he said. sounding insecure')
re.escape("www.python.com")
匹配模式的子字符串(子模式)称为组,组号与左端左括号数相等,整个字符串为组0
如:'There (was a (wee) (cooper)) who (lived in Fyfe)'包含以下组
部分函数会返回MatchObject对象,这个对象包含匹配模式的各个组的信息,可以通过一些方法来访问
这些方法可以省略参数,默认为组0即整个字符串
m = re.match(r'www\.(.*)\..{3}', 'www.python.org')
#模式使用原始字符串,防止反斜杠被提前转义
#.*表示任意数量的任意字符
#.{3}表示三个任意字符
#这个模式匹配到的是,'www.' 任意数量的任意字符 . 三个任意字符
#组0为www.python.org
#组1为python
m.group(1)
m.start(1) #起始索引
m.end(1) #结束索引 + 1
m.span(1) #起始和结束索引
模拟markdown将“*somthing*”自动转换为HTML标签的“< em>somthing< /em>”
emphasis_pattern = re.compile(r'''
\* #Beginning emphasis tag -- an asterisk
( #Begin group for capturing phrase
[^\*]+ #Capture anything except aster
) #End group
\* #Ending emphasis tag
''', re.VERBOSE) #对compile函数采用VERBOSE标志,对模式进行详细说明
re.sub(emphasis_pattern, r'<em>\1</em>', 'Hello *world*!')
#这里的第二个参数使用了“\1”,这里表示组1
#等价于emphasis_pattern.sub(r'<em>\1</em>', 'Hello *world*!')
emphasis_pattern = r'\*(.+)\*'
text = '*This* is *it*!'
repl = r'<em>\1</em>'
re.sub(emphasis_pattern, repl, text)
#模式匹配了从开始星号到结束星号的所有内容,这就是贪婪模式
emphasis_pattern = r'\*(.+?)\*'
#我们在+后面加上?,即变为非贪婪模式,它仅会匹配到下一个匹配项前的最少内容
re.sub(emphasis_pattern, repl, text)