python编程实例之正则表达式

发布时间:2019-07-23编辑:脚本学堂
本文介绍了python正则表达式的用法,python编程实例之正则表达式教程,感兴趣的朋友参考下。

python正则表达式re匹配字符串,python中使用正则表达式。

1. 匹配字符

正则表达式中的元字符有 .  ^  $ *   +  ?  { }  [ ]    | ( )

匹配字符用的模式有
d 匹配任意数字
D 匹配任意非数字
s 匹配任意空白字符
S 匹配任意非空格字符
w 匹配任意数字或者字母
W  匹配任意非数字或者字母

2.  正则表达式

python中使用compile处理正则表达式,如:
import re;

p=re.compile(‘[a-c]’);

p.match(s);

s是待匹配的字符串,match是匹配方法,类似的方法有
match()   确定从行首开始匹配
search()   在任意位置匹配
findall()  找匹配的所有子串,并作为子串返回
finditer()   找匹配的所有子串,并且以迭代器的形式返回

match也有很多方法,如:
group()   把正则表达式匹配的字符串返回
start()  返回匹配的起点
end()   返回匹配的终点
span()   返回匹配的(start,end)的元组

例1:
 

复制代码 代码示例:
>>>import re;
>>>p=re.compile(‘^[a-c]’)
>>>q=p.match(“abcd”);
>>>print q.group()
ab
>>>>q.span()
(0,2)

例2:
 

复制代码 代码示例:
>>>import re
>>>p=re.compile(‘d+’);
>>>q=p.findall(‘1 and 10 and 20’);
>>>print q
[‘1’,’2’,’3’]

 上述的匹配也可以使用另外一种形式,即:
re.match(’d+’,’d23r’)

例3:
 

复制代码 代码示例:
>>>p=re.match(’d+’,’d23r’)
>>>print p
None

匹配的其它参数:
re.compile(‘[a-c]’,re.I)  re.I 表示忽略大小写
re.compile(‘^ab$’,re.M)  re.M 表示^或者$在行首和行尾以及字符串的开头和结束都会进行匹配。如果不加这个标志,只会在字符串的开始和结束之处匹配

例4:
 

复制代码 代码示例:
re.compile(“””
[1-3]       #1-3
[a-c]      # a-c
“””,re.VERBOSE
)

re.VERBOSE  的出现使得正则表达式可以再多行出现,而且可以在每行加上注释

上面的匹配相当于 re.compile(‘[1-3][a-c]’)

3.  分组

使用()来进行分组

例5:
 

复制代码 代码示例:
>>>p=re.compile(‘(12)+’)
>>>m=p.match(‘121212’)
>>>print m.group()
121212

上面匹配的是12重复出现一次或多次

还可以打印分组的信息,
 

复制代码 代码示例:
>>>print m.group(1)
12

python会自动捕获分组的信息,如果不想捕获分组的信息,可以使用?:

例6:
 

复制代码 代码示例:
>>>import re
>>>s =”hello ab1cd”;
>>>p=re.search(‘(?:h.*)(a.*)(c.*)’);
>>>print “a* {0}”.format(p.group(1))
a*   ab
>>>print “c* {0}”.format(p.group(2))
c*   cd
 

p.group(0)存放的是整个表达式的匹配情况,p.group(1)存放的是(a.*)的匹配信息,p.group(2)存放的是(b.*)的匹配信息,而 h.*前面因为有?:没有被捕获

如果分组过多,使用组的标号还是显得麻烦,这时可以对组进行命名,然后可以通过名字来使用它们。

例7:
 

复制代码 代码示例:
>>>import re;
>>>s=”hello ab1cd”
>>>p=re.search(‘(?P<a>a.*)(?P<c>c.*)’);
>>>print “a*  {0}”.format(p.group(‘a’)
a*   ab
>>>print “c*  {0}”.format(p.group(‘c’))
c*   cd

4.贪婪和非贪婪模式

在贪婪模式下,* + 都会尽可能地多匹配字符,如:

例8:
 

复制代码 代码示例:
>>>import re;
>>>p=re.compile('<h.*></h>');
>>>m=p.findall('<h1></h><h2></h>')
>>>print m;
[‘<h1></h><h2></h>’]

有时希望它匹配出<h1></h>,<h2></h>两个结果,这时就可以用非贪婪模式了。只要在*或.后面加上?。

例9:
 

复制代码 代码示例:
>>>import re;
>>>p=re.compile('<h.*?></h>');
>>>m=p.findall('<h1></h><h2></h>')
>>>print m;
[‘<h1></h>’,’<h2></h>’]

5. 前向定界符和后向定界符

如果先匹配模式A,在匹配模式B,可以使用A(?=B),如果先匹配模式A,而且希望后面没有B,可以使用A(?!B).

例10:
 

复制代码 代码示例:
>>>import re;
>>>s=”ab2cd”
>>>m=re.search(“ab2(?=cd)”,s);
>>>print m.group();
ab2cd

例11:
 

复制代码 代码示例:
>>>import re;
>>>s='ab2cd'
>>>m=re.search('ab2(?!cd)',s);
>>>print m
None

类似地,如果匹配模式B,同时在其前面要有模式A,可以使用(?<=A)B的形式,

如果匹配模式B,同时在其前面没有模式A,可以使用(?<!A)B的形式

例12:
 

复制代码 代码示例:
>>>import re;
>>>s=”ab2cd”;
>>>m=re.search(‘(?<=ab2)cd’,s)
>>>print m.group()
cd

例13:
 

复制代码 代码示例:

>>>import re

>>>string= "ab2cd"
>>>pattern = re.search(r'(?<!ab2)cd',string)
>>>print pattern;
None

以上通过实例介绍了python中正则表达式的用法,希望对大家有所帮助。