正则表达式
一、定义
- 正则表达式是对字符串操作的一种逻辑公式,一般使用正则表达式对字符串进行匹配和过滤
- 正则表达式由普通字符和元字符组成
- 优点:灵活,功能性强,逻辑性强
- 缺点:上手难,一旦上手,会爱上这个东西
- 工具:各大文本编辑器一般都有正则匹配功能。在线测试网址:http://tool.chinaz.com/regex/
二、普通字符
普通字符包含大小写字母、数字。在匹配普通字符时直接写就好。比如"abc"匹配的就是”abc”
三、元字符
1. 字符组
用[ ]括起来,在[ ]中出现的内容会被匹配。例如:[abc]匹配a或b或c
- [a-z]:匹配a到z之间的一个字母
- [0-9]:匹配所有阿拉伯数字的一个
- [a-zA-Z0-9]:匹配a-z或A-Z或0-9其中的一个
2. 简单元字符
- .:匹配换行符以外的任意字符
- \w:匹配字母或数字或下划线
- \s:匹配任意的空白符
- \d:匹配数字
- \n:匹配一个换行符
- \t:匹配一个制表符
- \b:匹配一个单词的结尾
- ^:匹配字符串的开始
- $:匹配字符串的结尾
- \W:匹配非字母或数字或下划线
- \D:匹配非数字
- \S:匹配非空白符
- a|b:匹配字符a或字符b
- ():匹配括号内的表达式,也表示一个组
- [...]:匹配字符组中的字符
- [^...]:匹配除了字符中字符的所有字符
3. 量词
- *:重复0次或更多次
- +:重复一次或更多次
- ?:重复0次或一次
- {n}:重复n次
- {n, }:重复n次或更多次
- {n, m}:重复n到m次
四、贪婪匹配与惰性匹配
1. 贪婪匹配
量词中的*,+,{}都属于贪婪匹配,就是尽可能多的匹配到结果
str:hello world reg: h.* 此时匹配的结果:hello world
str:<div>hello</div> reg:<.*> 此时匹配的结果:<div>hello</div>
2. 惰性匹配
在使用.*后面如果加了"?"则是尽可能的少匹配
str:hello world reg:h.*? 此时匹配的结果:h
str:<div>hello</div> reg:<.*?> 此时匹配的结果: <div> </div>
五、分组
在正则中使用()进行分组。
例如要匹配一个相对复杂的身份证号。身份证号分成两种。老的身份证号有15位,而新的身份证号有18位。并且新身份证号结尾可能是x
正则为:
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
六、转义
在正则表达式中,有很多有特殊意义的元字符,比如\n和\s等。如果要在正则中匹配正常的"\n"而不是换行就需要对"\"进行转义。
同理,在python中,对于\n,\s等也是有特殊意义的,如果要得到"\n"也需要对"\"进行转义,所以,如果需要匹配字符\n,在正则表达及python表达中需要写成如下表格形式。
目标 | 正则 | python |
\n | \\n | \\\\n |
表1 "\n"转义
此时可以利用r"\n"不转义,即上表中python中正则表达可写为:r"\\n"