关于Python中正则表达式的用法
在我们写程序的过程中经常会遇到处理字符串的情况,大致分为以下几种场景:
- 匹配一个字符串是否符合给定的标准
- 从字符串中找到符合要求的文本
- 替换字符串中的某些文本
- 对字符串进行分割以分别处理
而正则表达式是用于处理字符串的强大工具,掌握正则表达式有利于更好地处理字符串,提高效率
正则表达式的语法
特殊字符
字符 | 描述 | 举例 | 匹配的表达式 |
---|---|---|---|
\ | 转义符 | \n | 表示换行符 |
\n | 匹配一个换行符 | ||
\t | 匹配一个制表符 | ||
^ | 匹配字符串的开头 | ^abc | abc |
$ | 匹配字符串的末尾 | abc$ | abc |
. | 匹配除换行符外的任意字符 | ab. | abc \ ab1 |
[...] | 用来表示一组字符 | [0-9] | 匹配一个数字 |
[^...] | 不在 [] 中的字符 | [^0-9] | 匹配非数字 |
| | 匹配或 | a|b | 匹配a或者b |
( ) | 匹配括号内的表达式,表示分组 | a(12|34)b | a12b |
预定义字符
字符 | 描述 | 举例 | 匹配的表达式 |
---|---|---|---|
\w | 匹配字母数字及下划线 | \wbc | abc |
\W | 匹配非字母数字及下划线 | \Wbc | 1bc |
\s | 匹配任意空白字符,包括空格和Tab等 | a\sb | a b |
\S | 匹配任意非空白字符 | a\Sb | a1b |
\d | 匹配任意数字,等价于 [0-9] | 00\d | 001 |
\D | 匹配任意非数字 | 00\D | 00a |
量词
字符 | 描述 | 举例 | 匹配的表达式 |
---|---|---|---|
* | 匹配 0 个或多个的表达式 | ab* | a \ abbb |
+ | 匹配 1 个或多个的表达式 | ab+ | ab \ abbb |
? | 匹配 0 个或 1 个由前面的正则表达式定义的片段,非贪婪方式 | ab? | a \ ab |
{n} | 精确匹配 n 个前面表达式 | ab{2} | abb |
{n, m} | 匹配 n 到 m 个由前面的正则表达式定义的片段,贪婪方式 | ab{1,2} | ab \ abb |
re模块
Python通过re模块提供对正则表达式的支持。由于Python的字符串本身也用\转义,所以当一个字符串包含大量转义字符时,就需要写出很多个\,比较麻烦,Python里的原生字符串很好地解决了这个问题,使用Python的r' '
前缀,就不用考虑转义的问题了。
re.match(r'正则表达式', str)
match()
方法判断是否匹配,如果匹配成功,返回一个Match
对象,否则返回None
re.split(r'切分的字符', str)
split()
方法用来切分字符串,返回一个list
对象
如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串,且group(0)是原始字符串,group(i)表示第i个子串。
m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
m.group(0) #'010-12345'
m.group(1) #'010'
m.group(2) #'12345'
常用正则表达式
1、匹配email地址:
[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?
2、匹配网址URL:
[a-zA-z]+://[^\s]*
3、匹配18位身份证号:
^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$
4、匹配年月日格式:
([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))
5、匹配整数:
^-?[1-9]\d*$
6、匹配正整数:
^[1-9]\d*$
7、匹配负整数:
^-[1-9]\d*$
8、匹配空白行:
\n\s*\r
正则表达式非常强大,内容也非常多,需要经常性的学习和实践,温故而知新。