正则表达式

组成:字符+操作符

常用操作符:

操作符 说明 实例
. 表示任何单个字符
[] 字符集,对单个字符给出取值范围 [abc]表示a或b或c,[a-z]表示a到z任意单个字符
[^] 非字符,给出排除范围 [^abc]表示非a或b或c的单个字符
* 前一个字符0次或无限次扩展 abc*表示ab,abc,abcc等
+ 前一个字符1次或无限次扩展 abc+表示abc、abcc\abccc等
前一个字符0次或一次扩展 abc?表示ab、abc
\ 左右表达式任取一个 abc\ def表示abc或def
{m} 扩展前一个字符m次 ab{2}c表示abbc
{m,n} 扩展前一个字符m至n次 ab{1,2}c表示abc、abbc
^ 匹配字符串的开头 ^abc表示abc且在一个字符的开头
$ 匹配字符串的结尾 abc$表示abc且在一个字符串的结尾
() 分组标记,内部只能使用\ 操作符 (abc)表示abc,(abc\ def)表示abc或def
\d 数字,等价于[0-9]
\w 单词字符,等价于[A-Za-z0-9]

实例

正则表达式 对应字符
^[A-Za-z]+$ 由26个字母组成的字符串
^[A-Za-z0-9]+$ 由字母或数字组成的字符串
^-?\d+$ 整数形式字符串
^[0-9]*[1-9][0-9]*$ 正整数形式的字符串
[1-9]\d{5} 邮政编码,6位
\u4e00-\u9fa5 匹配中文字符
d{3}-\d{8} 电话号码

匹配ip地址的正则表达式:

ip地址分4段,每段0-255

0-255可再分位4段:

0-99:[1-9]?\d

100-199:1\d{2}

200-249:2[0-4]\d

250-255:25[0-5]

(([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]).){3}([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])

re库的使用

正则表达式的表示类型:

raw string(原生字符串)r’text’:不包含转义符的表达式

常用功能函数:

函数 说明
re.search() 在一个字符串中搜索正则表达式的第一个位置,返回match对象
re.match 从一个字符串的开始位置起
re.findall() 搜索字符串,以列表类型返回全部匹配的字符
re.split() 将字符串按正则表达式匹配结果进行分割,返回list
re.sub() 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串

re.search(pattern,string,flags=0)

pattern:正则表达式的字符串

string待匹配的字符串

flags:

  • re.I:忽略大小写
  • re.M:^可以将给定字符串的每行当作匹配开始
  • re.S:’.’可以匹配所有字符,如果不加re.S不匹配换行符

re.match(pattern,string,flags=0):
如果在开头没有匹配到则返回空

re.findall():返回所有符合条件的结果组成一个list

re.split(pattern,string,maxsplit=0,flags=0)

  • maxsplit:最大分割数,剩余部分作为最后一个元素输出
1
2
3
4
>>>re.split(r'[1-9]\d{5}','BIT100081 TSU100084')
['BIT','TSU','']
>>>re.split(r'[1-9]\d{5}','BIT100081 TSU100084',maxsplit=1)
['BIT','TSU10084']

re.sub(pattern,repl,string,count=0,flags=0)
在一个字符串中替换所有匹配正则表达式的字串,返回替换后的字符串

  • repl:替换匹配到字符串的字符串
  • count:最大替换次数
1
2
>>>re.sub(r'[1-9]\d{5}',':zipcode','BIT100081 TSU100084')
'BIT:zipcode TSU:zipcode'

等价用法:

1
2
3
4
5
##函数式用法:一次性操作
>>>rst=re.search(r'[1-9]\d{5}','BIT100081 TSU100084')
##面向对象用法:编译后多次操作
>>>pat=re.compile(r'[1-9]\d{5})
>>>rst=pat.search('BIT 100081')

re.comple:可以将正则表达式表示编译为正则表达式对象(可以重复使用)

贪婪和最小匹配

默认贪婪匹配
如果希望进行最小匹配,需要对操作符进行扩展(加?)

操作符 说明
*? 前一个字符0次或无限次扩展,最小匹配
+? 前一个字符1次或无限次扩展,最小匹配
?? 前一个字符0次或1次扩展,最小匹配
{m,n}? 扩展前一个字符m至n次(含n),最小匹配