首页 > 代码库 > python模块学习(2)——re模块
python模块学习(2)——re模块
正则表达式并不是python的一部分,正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了。
下图展示了使用正则表达式进行匹配的流程:
正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。如果表达式中有量词或边界,这个过程会稍微有一些不同,但也是很好理解的,看下图中的示例以及自己多使用几次就能明白。
python通过re模块提供对正则表达式的支持,在python中使用‘r’解决转义字符带来的困扰,例如r"\n"是由‘\’和‘n‘两个字符组成。正则表达式可以包含特殊和普通字符,对于普通字符很好处理,只需匹配他们,但是对于特殊字符,例如‘|’或‘(‘这样的字符,就要特殊处理了。
特殊字符:
‘.’
.是默认模式,它能匹配任意字符除了换行符,如果DOTALL标识被指定,将会匹配包括换行符在内的任意字符。
例如
字符串:abcdfgh
正则表达式:a.cdf
匹配结果:abcdf
‘*‘
匹配前一个字符0或无限次。例如ab*将能匹配‘a‘,‘ab‘,‘abbb‘,‘abbbbbbbb‘...
‘?‘
匹配前一个字符0或1次,例如ab?将能匹配‘a‘,‘ab‘
‘*?, +?, ??‘
‘*‘,‘+‘,‘?‘这些限定符是贪婪的,他们尽可能匹配多的字符,但有时并不希望是这样的,例如<.*>匹配‘<H1>title</H1>’将匹配整个字符串,而我们只希望匹配<H1>。这时我们可以通过在限定符后添加‘?‘使它变为非贪婪的,这样它将匹配尽可能少的字符。使用<.*?>将只匹配‘<H1>‘。
‘\’
转义字符,使用‘\‘之后的特殊字符将成为一个普通的字符,例如字符串中有*号需要匹配,使用‘\*‘或[*]
‘\w‘
匹配Unicode(str)单词字符,包括单词中的大部分字符,同时还包括数字和下划线,如果使用ASCII标识,只有[a-zA-Z0-9]被匹配,这种情况下,最好明确写出需要匹配的字符。例如:
字符串:abcde
表达式:a\wcd
匹配结果:abcd
‘(...)‘
被括起来的表达式将作为分组,从表达式的左边开始每遇到一个分组的左括号‘(’,编号+1.另外分组表达式作为一个整体,可以后接数量词,表达式中的‘|‘仅在该组中有效。例如:(abc){2}匹配 的字符:abcabc;a(123|456)c 匹配的字符:a123c、a456c.
(待积累...)
2. re方法:
re.sub(pattern, repl, string, count=0, flags=0)
使用repl根据pattern替换string中的字符并返回字符串。如果没有pattern,返回的string没有改变;repl可以是一个字符串或者函数,如果是字符串,转义字符可以被处理;如果repl是一个函数,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。 count用于指定最多替换次数,不指定时全部替换。
re.match
(待积累。。。)
3、match对象
match对象是一次匹配的结果,通常是一个布尔值。它有如下方法和属性:
match方法:
match.group([group1, ...])
返回一个或多个匹配的子组,若只有一个参数,返回一个值,如果有多个参数,则以元组形式返回,如果没有参数。group1默认为0,返回整个匹配,如果groupN参数为0,仍然返回整个匹配字符串,如果返回字符返回超过匹配范围,抛出IndexError异常。
>>> m=re.match(r‘(\w+)(\w+)‘,‘isaac newton,physicists‘) >>> m.group(0) ‘isaac‘ >>> m.group(1) ‘isaa‘ >>> m.group(2) ‘c‘ >>> m.group(3) Traceback (most recent call last): File "<pyshell#10>", line 1, in <module> m.group(3) IndexError: no such group >>> m.group(1,2) (‘isaa‘, ‘c‘)