1.什么是正则表达式
正则表达式是可以匹配文本片段的模式。最简单的正则表达式就是普通的字符串,可以匹配其自身。也就是正则表达式'python'可以匹配字符串'python'。你可以用这种匹配行为搜索文本中的模式,并且用计算后的值替换特定模式,或者将文本进行分段。
通配符
正则表达式可以匹配多于一个的字符串,你可以使用一些特殊字符创建这类模式。比如点号(.)可以匹配任何字符(除了换行符),所以正则表达式'.ython'可以匹配字符串'python'和'jython'等,但是不会匹配'cpython'或者'ython'这样的字符串,因为点号只能匹配一个字母而不是两个或零个。
因为它可以匹配“任何字符串”,点号就称为通配符
对特殊字符进行转义
在正则表达式中如果将特殊字符作为普通字符使用会遇到问题,如需要匹配字符串'python.org',直接用'python.org'也会匹配'pythonzorg',这可不是期望的结果。为了让特殊字符表现得像普通字符一样,需要对它进行转义--可以在它前面加上反斜线。本例可以使用'python\\.org',这样就只会匹配'python.org'了。
字符集
匹配任意字符串可能很有用,但有些时候你需要更多的控制权。你可以使用中括号扩住字符串来创建字符集。字符集可以匹配它所包括的任意字符,所以[pj]ython能够匹配字符串'python'和'jython',而非其他内容。你可以使用范围,比如'[a-Z]'能够(按字母顺序)匹配a到z的任意一个字符,还可以通过一个接一个的方式将范围联合起来使用,比如'[a-z-A-Z0-9]'能匹配任意大小写字母和数字。
为了反转字符集,可以在开头使用^字符,比如‘[^abc]’可以匹配任何除了a、b和c之外的字符。
选择符和子模式
在字符串的每个字符都各不相同的情况下,字符集是很好用的,但如果只想匹配字符串'python'和'perl'呢?你就不能使用字符集或者通配符来指定某个特定的模式了,取而代之的是用于选择的特殊字符:管道符号(|)。因此、所需的模式可以写成'python|per'
有时候不需要对整个模式使用选择运算符,只是模块的一部分。这时可以使用圆括号括起需要的部分,或称子模式。前例可以写成'p(ython|erl)'
可选项和重复子模块
在子模块后面加上问号,它就变成了可选项。它可能出现在匹配字符串中,但并非必须的。如:
r'(http://)?(www\.)?python\.org'
只能匹配下列字符串
'http://www.python.org'
'http://python.org'
www.python.org'
'python.org'
下面运算符允许子模式重复多次:
(pattern)*:允许模式重复0次或多次;
(pattern)+:允许模式重复1次或多次;
(pattern){m,n}:允许模式重复m~n次。
字符串的开始和结尾
字符串'www.python.org'中的子字符串'www'能够匹配模式'w+'、在寻找这样的字符串时,确定子字符串位于整个字符串的开始还是结尾是很有用的。只想字符串在开头而不是其他位置匹配'ht+p',那么可以使用脱字符(^)标记开始:'^ht+p'会匹配'http://python.org'但是不匹配'www.http.org'。类似的,字符串结尾用美元符号($)标示。
2.re模块的内容
函数 | 描述 |
compile(pattern[,flags]) | 根据包含正则表达式的字符串创建模式对象 |
search(pattern,string[,flags]) | 在字符串中寻找模式 |
match(pattern,string[,flags]) | 在字符串开始处匹配模式 |
split(pattern,string[,maxsplit=0]) | 根据模式的匹配项来分割字符串 |
findall(pattern,string) | 列出字符串中模式的所有匹配项 |
sub(pat,repl,string[,count=0]) | 将字符串中所有pat的匹配项用repl替换 |
escape(string) | 将字符串中所有特殊正则表达式字符转义 |
函数re.compile将正则表达式转换为模式对象,可以实现更有效率的匹配。正在调用search或者match函数的时候使用字符串表示的正则表达式,它们也会在内部将字符串转换为正则表达式对象。使用compile完成一次转换后,在每次使用模式的时候就不用进行转换。
函数re.search会在给定字符串中寻找第一个匹配给定正则表达式的子字符串。一但找到子字符串,函数就会返回MathObject(值为True),否则返回None(值为False)。
函数re.match会在给定字符串的开头匹配正则表达式。因此,match('p','python')返回真,而re.match('p','www.python.org')则返回假
函数re.split会根据模式的匹配项来分割字符串。
>>>some_text='alpha,beat...,gamma delta' >>>re.split('[.]',some_text) ['alpha','beat','gamma','delta']
函数re.findall以列表形式返回给定模式的所有匹配项
>>>pat='[a-zA-Z]+' >>>text='"Hm.. Err -- are you sure"'' >>>re.findall(pat,text) ['Hm','Err','are','you','sure']