1.正则表达式入门
例1:匹配不包含数字的字符组
可以通过在字符数组开头使用 ^ 字符实现取反操作,从而可以反转一个字符组(意味着会匹配任何指定字符之外的所有字符)。
例2:这里的 n[^e] 的意思就是n后面的字母不能为 e。
例3:接下来请你匹配爱后面不包含你的数据。
例4:匹配不包含小写字母的数据。
2.快捷方式
1.快捷匹配数字和字母
例:请你使用快捷方式匹配下面的单词。
以目前学到的内容,如果想要匹配所有的字母,会使用[A-Za-z],要匹配数字会使用[0-9]
还有没有更简洁的方式呢?
正则表达式引擎提供了一些快捷方式如:\w 可以与任意单词字符匹配。
当我们想要匹配任意数字的时候也可以使用快捷方式\d,d即digit数字的意思,等价于[0-9]。
快捷方式 | 描述 |
---|---|
\w | 与任意单词字符匹配,任意单词字符表示 [A-Z]、 [a-z]、[0-9]、_ |
\d | 与任意数字匹配 |
2.匹配空白
例:匹配空白分隔的单词。
知识点
快捷方式 | 描述 |
---|---|
\s | \s快捷方式可以匹配空白字符,比如空格,tab、换行等 |
例如:
3.单词边界
例:匹配如下数据。
快捷方式 | 描述 |
---|---|
\b | 匹配的是单词的边界 |
\bmaster\b 就仅匹配有边界的master单词。
当然其他类型的数据,比如数字也能匹配:
3. 总结
快捷方式 | 描述 | 示例 |
---|---|---|
\s | \s快捷方式可以匹配空白字符,比如空格,tab、换行等 | |
\w* 可以匹配[0, ] | ||
\w+ 可以匹配[1, ] | ||
^ | 表示取反 | n[^e] 的意思就是n 后面的字母不能为 e |
a{N} 重复n次 | ||
\s 匹配空白 | \s快捷方式可以匹配空白字符,比如空格,tab、换行等。 | |
\b xxx\b 单词边界 | \bmaster\b 就仅匹配有边界的master单词。而不能匹配masters | |
. 字符只有一个不能匹配的字符, | 也就是换行符(\n).字符代表匹配任何单个字符,它只能出现在方括号以外。 | |
字符组([] ) | [Jj]ava [Jj]表示[]内的字母2选一, 允许匹配一组可能出现的字符。 | [Jj]ava可以匹配Java8.0和java8.0,不能匹配jjva和Javv |
? 可选字符 | 配一个单词的不同写法 | colou?r和honou?r,可以匹配color和colour,或者honor与honour |
{M,N} 不知道要匹配字符组要重复的次数,如身份证有15位也有18位的。 | 重复区间,\d{3,4} 既可以匹配3个数字也可以匹配4个数字,不过当有4个数字的时候,优先匹配的是4个数字(\d{3,4}优先3) | \d{3, 4}? 匹配073或者0731 |
\w | 与任意单词字符匹配,任意单词字符表示 [A-Z]、 [a-z]、[0-9]、_ | |
\d | 与任意数字匹配 | d 即 digit 数字的意思,等价于[0-9] |
取反 | 对于\w的取反为\W,将小写改写成大写即可,其他快捷方式也遵循这个规则。 | |
开始和结束 | ^ 指定的是一个字符串的开始,$ 指定的是一个字符串的结束。 | |
. | 表示任意字符,. 字符只有一个不能匹配的字符,也就是换行符(\n),不过要让. 字符与换行符匹配也是可以的 | a… 可以匹配aii air等 |
{N} 重复 | 在一个字符组后加上{N} 就可以表示在它之前的字符组出现N次。 | \d{4}-\d{7} 可匹配 0731-8825951,0733-8794561 |
开闭区间 | 遇到字符组的重复次数没有边界,闭区间不写即可表示匹配一个或无数个。 | \d{1,} 可以分别匹配 073、0731、123456789 |
+ | + 匹配1个到无数个 | + 等价于{1,} |
* | * 代表0个到无数个 | * 等价于{0,} |
[] 字符组 | [] 字符组中可以放多个条件 | 例如,想要匹配数字的小写字母可以这样写:[0-9a-z] |
4. 多种匹配模式(总结)
5. 案例
s = 'he111Lowor1d'
s1 = re.findall(r'(\d+)', 'a' + s + '0')
s1
Out[11]: ['111', '1', '0']
s = 'he11owor1d'
s1 = re.findall(r'(\D+)(\d+)', 'a' + s + '0') # \D+匹配多个非数字,\d+匹配多个数字
s1
Out[5]: [('ahe', '11'), ('owor', '1'), ('d', '0')]
6. 相关网站(正则训练)
7. 进阶
7.1 分组
在正则表达式中,提供了一种将表达式分组
的机制,当使用分组时,除了获得整个匹配。
还能够在匹配中选择每一个分组。要实现分组很简单,使用 ()
即可。
7.2 非捕获分组
有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。
这个时候就可以使用非捕获组(?:表达式)
,从而不捕获数据,还能使用分组的功能。
例如,想要匹配两个字母
组成的单词,或者四个字母
组成的单词,就可以使用非捕获分组: