正则表达式
对于正则表达式,已经看过很多相关的知识了,但是因为每次都只是限于看别人写的博客,再加上平时用的比较少,导致在需要用到正则表达式的相关知识时,总是显得力不从心,很多内
容的知识点自己都知道,但是总是不知道该怎么写.出现此种现象的原因是练习的很少,而很多知识的掌握都是基于大量的练习之上的.鉴于最近在工作中有用到正则表达式,在巩固已有的
正则表达式的知识点上,通过练习再加深对正则表达式的理解,并能彻底的掌握正则表达式.
正则表达式
正则表达式,Regular Expression,主要是通过模式匹配的方式在目标字符串中找出符合特定规则的字符(串).正则表达式的功能是很强大的,但一般不单独使用,目前所有主流的开发语
言都有专门的库或模块处理正则表达式.在Python中处理正则表达式的模块的re,后面将主要使用re进行正则表达式的学习和练习.
以下内容均使用`raw_string = "I am a student,I'm 20 years old.hhhhh"`来进行练习.
符号
正则表达式由普通字符和元字符组成,普通字符即数字,字母等字符,元字符是由一些有特定意义的字符组成.
普通字符
普通字符的匹配是正则表达式中最简单的匹配.如下例子:
`re.findall('[abc123], raw_string)'` 返回的内容是['a', 'a', '2', 'a'],[abc123]表示匹配abc123中的一个字符.
`re.findall('[a-z]',raw_string)` 返回的内容是['a', 'n', 'a', 's', 't', 'u', 'd', 'e', 'n', 't', 'm', 'y', 'e', 'a', 'r', 's', 'o', 'l', 'd', 'h', 'h', 'h'],使用普通字符匹配时,可以在[]中使用-表示范围,这样可以在
匹配内容是连续字符时不用逐个列出要匹配的字符.[a-z]表示匹配所有的小写字母.
元字符
普通字符是在简单的字符匹配时使用的,要匹配复杂的字符,则要使用元字符进行匹配.
元字符包括如下内容:
^ ==>匹配输入字行首,仅表示匹配开始位置,不匹配实际字符,如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置.
$ ==>匹配输入行尾.如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置.
* ==>匹配前面的子表达式零次或多次,例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”.*等价于o{0,}
+==>匹配前面的子表达式一次或多次(大于等于1次).例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”.+等价于{1,}.
? ==>匹配前面的子表达式零次或一次.例如,“do(es)?”可以匹配“do”或“does”中的“do”.?等价于{0,1}.
{n} ==>n是一个非负整数.匹配确定的n次.例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o.
{n,} ==>n是一个非负整数.至少匹配n次.例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o.“o{1,}”等价于“o+”.“o{0,}”则等价于“o*”.
{n,m} ==>m和n均为非负整数,其中n<=m.最少匹配n次且最多匹配m次.例如,“o{1,3}”将匹配“fooooood”中的前三个o为一组,后三个o为一组.“o{0,1}”等价于“o?”.请注意在逗号和两个
数之间不能有空格.
? ==>当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的.非贪婪模式是尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所
搜索的字符串.例如,对于字符串“oooo”,“o+”将尽可能多的匹配“o”,得到结果[“oooo”],而“o+?”将尽可能少的匹配“o”,得到结果 ['o', 'o', 'o', 'o'].
. ==>匹配除“\n”之外的任何单个字符.要匹配包括“\n”在内的任何字符.可以使用“[\s\S]”.
d\ ==>匹配一个数字字符.等价于[0-9].
D\ ==>匹配一个非数字字符.等价于[^0-9].
s\ ==>匹配任何不可见字符,包括空格、制表符、换页符等等.等价于[ \f\n\r\t\v].
S\ ==>匹配任何可见字符.等价于[^ \f\n\r\t\v].
w\ ==>匹配包括下划线的任何单词字符,等价于[a-zA-Z0-9_].
W\ ==>匹配任何非单词字符.等价于[^A-Za-z0-9_].