python合法表达式_正则表达式(Python)正则表达式(Python)
特殊符号和字符
符号
记号 说明 正则表达式样例
literal 匹配字符串的值 foo
re1|re2 匹配正则表达式re1或者re2 foo|bar
. 匹配任何单个字符(换⾏除外) b.b
^ 匹配字符串的开始 ^Dear
$ 匹配字符串的结尾 /bin/*sh$
* 匹配正则表达式 0次或多次 [A-Za-z0-9]*
+ 匹配正则表达式 1次或多次 [a-z]+\
匹配正则表达式 0次或1次 goo
{N} 匹配正则表达式 重复N次 [0-9]{3}
{M,N} 匹配正则表达式 重复出现M次到N次 [0-9]{3,5}
[...] 匹配字符组中出现的任意⼀个字符 [aeiou]
[x-y] 匹配从字符x到y的任意⼀个字符 [0-9],[A-Za-z]
[^...] 不匹配此字符集中的字符 [^aeiou],[^A-Za-z0-9]
(*|+|?|{})? ⾮贪婪匹配 .*?[a-z]
(...) 匹配封闭括号中正则表达式RE ([0-9]{3})?,f(oo|u)bar
特殊字符
\d 匹配任何数字,同[0-9] data\d+.txt
\D 匹配任何⾮数字符
\w 匹配任何数字字母字符,同[A-Za-z0-9] [A-Za-z_]\w+
\W \w的反义词
\s 匹配任何空⽩符,同[\n\t\r\v\f] of\sthe
\S \s的反义词
\b 匹配单词边界 \bThe\b
\nn 匹配已保存的⼦组 price:\16
\c 逐⼀匹配特殊字符c \.,\\,\*
取消其特殊含义,按字⾯匹配
\A(\Z) 匹配字符串的起始(结束) \ADear
eg
[^>]+> 匹配所有合法(和⽆效)HTML标签的字符串
\d{3}-\d{3}-\d{3} 美国电话号码,如 800-555-1234
\d+(\.\d+)? 表⽰简单的浮点数
.*? ⾮贪婪的匹配任意长度字符
贪婪匹配
正则表达式默认为贪婪匹配。
也就是说,如果正则表达式模式中使⽤到通配字,那它按照从左到有的顺序求值时,回尽量抓取满⾜匹配的最长字符串。
⼀个解决办法是使⽤“⾮贪婪”操作符?。这个操作符⽤在*、+或者?的后⾯。 作⽤是要求正则表达式引擎匹配的字符越少越好。
re模块
match和search
match( rule,targetString [,flag] )
search( rule,flag] )
按照规则在⽬标字符串中进⾏匹配。
第⼀个参数是正则规则,第⼆个是⽬标字符串,第三个是选项(同compile函数的选项) 返回:若成功返回⼀个Match对象,失败⽆返回
不过它们的返回不是⼀个简单的字符串列表,⽽是⼀个MatchObject,通过操作这个matchObject,我们可以得到更多的信息。
需要注意的是,如果匹配不成功,它们则返回⼀个NoneType。所以在对匹配完的结果进⾏操作之前,你必需先判断⼀下是否匹配成功了,⽐如:
>>> m=re.match( rule,target )
>>> if m: #必需先判断是否成功
doSomethin
这两个函数唯⼀的区别是:match从字符串的开头开始匹配,如果开头位置没有匹配成功,就算失败
了;⽽search会跳过开头,继续向后寻是否有匹配的字符串。针对不同的需要,可以灵活使⽤这两个函数。
group和groups
group() ⽅法返回匹配的所有对象,或者是()表⽰的特定⼦组
python正则表达式不包含groups() ⽅法返回包含所有⼦组的元组
>>> import re
>>> p=re.match("(\d+)-(\d+)-(\d+)",'11-22-33')
>>> p.groups()
('11','22','33')
>>> p.group(0)
'11-22-33'
>>> p.group(0)
'11-22-33'
>>> p.group(1)
'11'
>>> p.group(2)
'22'
>>> p.group(3)
'33'
>>> p.group(4)
Traceback (most recent call last):
File "",line 1,in
IndexError: no such group
findall和finditer
findall(rule,target [,sans-serif; font-size:14px; line-height:22.399999618530273px"> 在⽬标字符串中查符合规则的字符串。第⼀个参数是规则,第⼆个参数是⽬标字符串,后⾯还可以跟⼀个规则选项(选项功能将在compile函数的说明中详细说明)。
返回结果结果是⼀个列表,中间存放的是符合规则的字符串。如果没有符合规则的字符串被到,就返回⼀个空列表。
finditer( rule,sans-serif; font-size:14px; line-height:22.399999618530273px"> 参数同findall
返回⼀个迭代器
finditer函数和findall函数的区别是,findall返回所有匹配的字符串,并存为⼀个列表,⽽finditer则并不直接返回这些字符串,⽽是返回⼀个迭代器。
>>> m=re.findall('\d+','1111 222 333 44 567')
>>> m.group()
Traceback (most recent call last):
File "",in
AttributeError: 'list' object has no attribute 'group'
>>> m
['1111','222','333','44','567']
>>> m=re.finditer('\d+','1111 222 333 44 567')
>>> for i in m:
... print up(),i.span()
...
<_sre.sre_match object at> 1111 (0,4)
<_sre.sre_match object at> 222 (5,8)
<_sre.sre_match object at> 333 (9,12)
<_sre.sre_match object at> 44 (13,15)
<_sre.sre_match object at> 567 (16,19)
sub和subn
sub ( rule,replace,count] )
subn(rule,count] )
在⽬标字符串中规格规则查匹配的字符串,再把它们替换成指定的字符串。你可以指定⼀个最多替换次数,否则将替换所有的匹配到的字符串。
第⼀个参数是正则规则,第⼆个参数是指定的⽤来替换的字符串,第三个参数是⽬标字符串,第四个参数是最多替换次数。
这两个函数的唯⼀区别是返回值。
sub返回⼀个被替换的字符串
sub返回⼀个元组,第⼀个元素是被替换的字符串,第⼆个元素是⼀个数字,表明产⽣了多少次替换。
>>> s=" I have a dog,you have a dog,he have a dog "
>>> re.sub('dog','cat',s,2)
' I have a cat,you have a cat,he have a dog '
>>> re.subn('dog',s)
(' I have a cat,he have a cat ',3)
split
split( rule,maxsplit] )
切⽚函数。使⽤指定的正则规则在⽬标字符串中查匹配的字符串,⽤它们作为分界,把字符串切⽚。 第⼀个参数是正则规则,第⼆个参数是⽬标字符串,第三个参数是最多切⽚次数 返回⼀个被切完的⼦字符串的列表

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。