python进阶之正则表达式
- 2020 年 1 月 20 日
- 笔记
概念:
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
目的?
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”)。
2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
符号:
正则表达试由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,我下面会给予解释。在最简单的情况下,一个正则表达式看上去就是一个普通的查找串。例如,正则表达式"testing"中没有包含任何元字符,它可以匹配"testing"和"testing123"等字符串,但是不能匹配"Testing"。要想真正的用好正则表达式,正确的理解元字符是最重要的事情。下表列出了所有的元字符和对它们的一个简短的描述。
正则 |
待匹配字符 |
匹配结果 |
说明 |
---|---|---|---|
[0123456789] |
8 |
True |
在一个字符组里枚举合法的所有字符,字符组里的任意一个字符和"待匹配字符"相同都视为可以匹配 |
[0123456789] |
a |
False |
由于字符组中没有"a"字符,所以不能匹配 |
[0-9] |
7 |
True |
也可以用-表示范围,[0-9]就和[0123456789]是一个意思 |
[a-z] |
s |
True |
同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示 |
[A-Z] |
B |
True |
[A-Z]就表示所有的大写字母 |
[0-9a-fA-F] |
e |
True |
可以匹配数字,大小写形式的a~f,用来验证十六进制字符 |
字符:
元字符 |
匹配内容 |
---|---|
. |
匹配除换行符以外的任意字符 |
w |
匹配字母或数字或下划线 |
s |
匹配任意的空白符 |
d |
匹配数字 |
n |
匹配一个换行符 |
t |
匹配一个制表符 |
b |
匹配一个单词的结尾 |
^ |
匹配字符串的开始 |
$ |
匹配字符串的结尾 |
W |
匹配非字母或数字或下划线 |
D |
匹配非数字 |
S |
匹配非空白符 |
a|b |
匹配字符a或字符b |
() |
匹配括号内的表达式,也表示一个组 |
[…] |
匹配字符组中的字符 |
[^…] |
匹配除了字符组中字符的所有字符 |
量词:
量词 |
用法说明 |
---|---|
* |
重复零次或更多次(贪婪匹配) |
+ |
重复一次或更多次(贪婪匹配) |
? |
重复零次或一次 |
{n} |
重复n次 |
{n,} |
重复n次或更多次 |
{n,m} |
重复n到m次 |
这边推荐一个验证正则表达式的一个工具 http://tool.chinaz.com/regex/
接下来大家可以使用上面的工具来测试下面说的实例
实例:
1.匹配任意数字
[0123456789]—abc123def456只要一个字符串中包含数字,都会被匹配到
2.匹配任意小写字母
[a-z] —-abc123def456只要字符串中包含任意小写字符,都会被匹配
3.匹配任意大写字母
[A-Z] —-ABC123DEF456只要字符串中包含任意大写字符,都会被匹配
4.匹配数字+小写字母+大写字母
[0-9A-Za-z] —-ABCabc123DEF456只要字符串中包含数字小写大写字母都回匹配
5.w 与 W与 [wW](匹配所有字符)



6.s 与 S 与 [sS](匹配所有字符)



7.d 与 D 与 [dD](匹配所有字符)



8.n 与 t(tab制表符) 与 b



9.^(匹配一个字符串的开头) 与 $


(匹配以[a-z]开头,以[a-z]结尾的字符串,这里只能匹配2个字符的字符串,因为[]代表一个字符组)
10.a|b(从左向右匹配,优先匹配a)



(左边匹配了,右边不会再匹配)
11.[^…]


组合练习:
*+?{}
待匹配字符串 |
正则表达式 |
匹配结果 |
说明 |
---|---|---|---|
小李和小王和小亮 小李和小王王和小亮亮亮 |
[^和]+ |
小李小王小亮 小李小王王小亮亮亮 |
匹配非'和'的所有字符串多次 |
小李和小王王和小亮亮亮 |
[^和]{2,4} |
小李小王王小亮亮亮 |
匹配非‘和’的所有字符串2到4次 |
小李和小王王和小亮亮亮 |
[^和]{2,4}? |
小李小王小亮亮亮 |
匹配非‘和’的所有字符串2次 |
小李和小王王和小亮亮亮 |
小.? |
小李小王小亮 |
匹配小后面任意字符0次或1次 |
小李和小王王和小亮亮亮 |
小.* |
小李和小王王和小亮亮亮 |
匹配小后面任意字符0次或多次 |
小李和小王王和小亮亮亮 |
小.+ |
小李和小王王和小亮亮亮 |
匹配小后面任意字符一次或多次 |
小李和小王王和小亮亮亮 |
小.{1,2} |
小李和小王王小亮亮 |
匹配小后面任意字符一次到2次 |
小李和小王王和小亮亮亮 |
小.*? |
小小小 |
匹配小后面任意字符0次(因为有?限制,表示匹配最少的页就是0次即什么都不匹配) |
字符集[] [^]
待匹配字符串 |
正则表达式 |
匹配结果 |
说明 |
---|---|---|---|
小李和小王王和小亮亮亮 |
小[李王王亮亮亮]* |
小李小王王小亮亮亮 |
匹配小后面字符组里面任意字符0次或多次 |
小李和小王王和小亮亮亮 |
小[^和]* |
小李小王王小亮亮亮 |
匹配小后面非和子的任意字符0次或多次 |
123abc345 |
[d] |
1 2 3 3 4 5 |
匹配任意一个数字 |
123abc345 |
[d]* |
123 345 |
匹配任意多个数字 |
123abc345 |
[d]+ |
123 345 |
匹配任意多个数字 |
分组()与或 | [^]
匹配15位或18位身份证,15位需都是数字组成,18位可以是数字或x结尾,首位都不能为0
待匹配字符串 |
正则表达式 |
匹配结果 |
说明 |
---|---|---|---|
110621199012014599 |
^[1-9]d{13,16}[0-9x]$ |
110621199012014599 |
可以匹配到一个正确的身份证,但是如果是16位1106211990120145也同样能匹配到,但是这并不是身份证 |
|
^[1-9]d{14}(d{2}[0-9x])?$ |
|
不会再匹配错误的身份证(你可以试试的) |
110621199012014599 |
^([1-9]d{16}[0-9x]|[1-9]d{14})$ |
110621199012014599 |
这个是比较好的表达式,先匹配18位,再匹配15位 |
总结:
要想熟练的使用正则表达式,还是要多练多写吧! 希望大家能像计算1+1=2这么简单的使用正则表达式