泰勒python笔记二:正则表达式

来源:互联网 发布:知在文言文中的意思 编辑:程序博客网 时间:2024/06/06 13:05

正则表达式是一种用来匹配字符串的工具。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
1.直接给出字符,就是精确匹配。
2.用\d可以匹配一个数字,\w可以匹配一个字母或数字,\b可以匹配单词分界或退格(匹配字符边界),\t可以匹配制表符tab,\r可以匹配回车符,\s匹配空格;\W表示匹配非字母数字,\S匹配非空格, \D匹配非数字,\B表示不含开头和结尾(匹配非字符边界的某个位置),. 可以匹配任意字符
3.要匹配变长的字符,用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符
4.特殊字符,在正则表达式中,要用’\’转义。
5.[]表示匹配范围,比如:

[0-9a-zA-Z_]可以匹配一个数字、字母或者下划线;

[0-9a-zA-Z_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如’a100’,’0_Z’,’Py3000’等等;

[a-zA-Z_][0-9a-zA-Z_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;

[a-zA-Z_][0-9a-zA-Z_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。
6.A|B可以匹配A或B,所以[A|a]bc可以匹配’Abc’或者’abc’。

^表示行的开头,^\d表示必须以数字开头。

$表示行的结束,\d$表示必须以数字结束。

你可能注意到了,^abc也可以匹配’abcd’,但是^abc$就变成了整行匹配,就只能匹配’abc’了。

常见用法补充:

(abc){3} 表示字符串“abc”重复3次[^a]指除“a”外的任意字符| 匹配前面或后面的表达式(逻辑或){n,} 最少匹配前面表达式n次(上限不定)“\b(\w+)\b\s+\1\b”中的数字“1”引用前面的“(\w+)”“(?<Word>\w+)”中把“\w+”定义为组,组名为“Word”“\b\w+(?=ing\b)”定位“ing”前面的字符串“(?<=\bsub)\w+\b”定位“sub”后面的字符串“\w*d(?!og)\w*”,“dog”不符合,“do”符合,!表示取非

Python提供re模块,包含所有正则表达式的功能。
由于python字符串本身也用\转义,所以最好用 r’ ’ 自然字符串表示,使其中的转义失效。

>>>import re>>>re.match(r'^\d{3}\-\d{3,10}$', '010-1234567')#返回<_sre.SRE_Match object at 0x1026e17c9>,匹配成功>>>re.match(r'^\d{3}\-\d{3,10}$', '010 1234567')#返回None,匹配失败#所以代码中写法如下test = '待匹配字串'if re.match(r'正则表达式', test):    print 'ok'else:    print 'failed'#切分字符串,split()支持正则匹配re.split(r'[\s\,\;]+', 'a,b;; c  d')['a', 'b', 'c', 'd']

正则表达式支持提取子串。用()表示的就是要提取的分组(Group)。^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码。

>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')>>> m<_sre.SRE_Match object at 0x1026fb3e8>>>> m.group(0)'010-12345'>>> m.group(1)'010'>>> m.group(2)'12345'#group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。

正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。

>>>re.match(r'^(\d+)(0*)$', '102300').groups()('102300', '')#由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。>>>re.match(r'^(\d+?)(0*)$', '102300').groups()('1023', '00')#采用非贪婪匹配(尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配。

编译问题(影响效率):re模块内部会先编译正则表达式,不合法会报错,然后采取匹配字符串。对于频繁调用的表达式应该预编译成Regular Expression对象。

 re_phone = re.compile(r'^(\d{3})-(\d{3,8})$')#预编译 re_phone.match('010-12345').groups()

最后声明,这些基本照搬廖雪峰老师的python教程,真的非常棒,我写在这里是为了帮自己加深印象,方便复习查找。
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000

1 0
原创粉丝点击