正则表达式(regular expression)是⼀种⼴泛⽤于匹配字符串的⼯具。它⽤⼀个“字符串”来描述⼀个特征,然后去验证另⼀个“字符串”是否符合这个特征,并获取匹配后的结果。
-
普通字符
字⺟、数字、汉字、下划线、以及没有特殊定义的符号,都是"普通字符"。正则表达式中的普通字符,在匹配的时候,只匹配与⾃身相同的⼀个字符。 -
元字符
. 除\n外的任意一个字符
| 逻辑或
[] 匹配字符集中的一个字符
[^] 对字符集取反
[-] 在[]中的取值区间
\ 转义字符
() 对表达式进行分组,将圆括号内的内容看成一个整体,并获得匹配的值。分组使用举例:
()内的字符串是一个单独整体,可独立使用|
r1 = re.match(r’\w{4,20}@(163|126).com$’, q).group()
\1表示引用第一个分组的内容,\2引用第二个分组内容,以此类推。
r2 = re.match(r’<(\w*)>(.*?)</\1>’, html_str).group() -
转义字符串
⼀些⽆法书写或者具有特殊功能的字符,采⽤在前⾯加斜杠""进⾏转义的⽅法。
\r \n 回车 换行
\t 制表符
\
^ 匹配^
$ 匹配$
. 匹配.
在正则表达式中具有特殊意义的字符需要匹配自身时都需要转义。还有|,(,[,*,? -
预定义匹配字符集
\d 任意一个数字,即0-9
\D \d的反集
\w 任意一个大小写字母或者数字或者下划线,即0-9a-zA-Z_
\W \w的反集
\s 换行符,空格,制表符任意一个
\S \s的反集
#匹配任意的数字字符串
re.match(r’\d+’, s)
#匹配任意的字符串,不包含特殊字符
re.match(r’\w+’, s)
-
重复匹配
{n} 表达式重复n次
{m,n} 表达式重复至少m次,最多n次
{m,} 表达式重复至少m次,没有上限
? 匹配表达式0次或者1次,相当于{0,1}
+表示最少出现一次,没有上限,相当于{1,}
*表示出现0次到任意次,相当于{0,} -
位置匹配
^ 在字符串开始的地方匹配,符号本身不匹配任何字符
re.match(r’^a’, ‘abcd’) 以a开头
$ 在字符串结束的地方匹配,符号本身不匹配任何字符
re.match(r’d$’, ‘abcd’) 以d结尾匹配163邮箱
re.match(r’\w+@(163|126).com$’, s)\b 匹配一个单词边界,就是单词和空格之间的位置,符号本身不匹配任何字符
\B 匹配非单词边界,即左右两边都是\w范围或者左右两边都不是\w范围时的字符缝隙。 -
贪婪模式和非贪婪模式
贪婪匹配:在重复匹配时,尽可能多的匹配到字符
非贪婪匹配:在重复匹配时,尽可能少的匹配到字符,写法是在匹配次数的特殊符号后面再加上一个?问号。 -
Python中重要的正则表达式模块re
常用的方法有:group() ,groups()
当匹配到数据时,使用group提取数据,groups()返回元组。
当没有匹配到数据时(None),调用时报错match() 只匹配一次目标字符串。特点是从字符串开始匹配,而且仅匹配一次,匹配不到即返回None
search(匹配表达式, 匹配目标字符串, 模式),特点是从字符串全文搜索匹配,而且仅匹配一次,匹配不到即返回None
findall() 匹配字符串全文的所有符合字符,返回list。特点是弥补了match和search只匹配一次的缺点,属于贪婪匹配模块。
compile(正则表达式, flag模式),注意flag模式,re.S 多行匹配(.也匹配到\n)
根据正则表达式的字符串创建模式对象,re的工厂方法,可提高匹配效率,返回一个re对象举例:
regu = re.complie(r’\w+@(163|126).com$’)
result = regu.match(‘123456@163.com’)
print(result.group())split() 切割,返回list
举例:
import re
s = ‘ab;cd|efg|hi|hi,jkl\topq;str,ubw\x07syd’
实现递归分割所有字符的功能
print(re.split(r’[,;|\t]+’, s))sub() 替换,类似str的replace方法