0x01 基本语法
修饰符(g i m)
- g:global表示全局匹配
- i:ignore case表示忽略大小写匹配
- m:multiple line多行匹配
元字符
.
:匹配除换行符以外的任意字符\w
:匹配字母、数字、下划线、汉字\s
:匹配任意空白字符\d
:匹配数字\b
:匹配单词的开始或者结束^
:匹配字符的开始$
:匹配字符的结束
重复
*
:重复0次或者多次+
:重复1次或者多次?
:重复0次或者1次{n}
:重复n次{n,}
:重复n次到多次{n,m}
:重复n到m次
字符类
[]
:匹配中括号中的任意一个字符
1 | [abc]:匹配abc任意一个字符 |
反义
[^]
:不包含中括号中的任意一个字符
1 | [^abc]:不包含abc任意一个字符 |
\W
:除\w意外的任意字符
\S
:匹配任意不是空白符的字符
\D
:匹配任意非数字的字符
\B
:匹配不是单词开头或结束的位置
范围类**
[a-z]、[A-Z]、[0-9]
:匹配范围内的任意一个
1 | [a-zA-Z0-9]:匹配范围中的任意一个字符 |
贪婪与非贪婪
1 | import re |
分组
abc{2}
:不分组,只重复最后一个字符
1 | "abc{2}",'abc') s = re.search( |
(abc){2}
:重复abc两次
1 | "(abc){2}",'abcabc') s = re.search( |
用小括号指定一个表达式后,每个分组自动拥有一个组号,从1开始编号。
\b(\w+)\b\s+\1\b
:可以匹配两个空格间隔的单词,如,go go
\b(?<Word>\w+)\b\s+\k<Word>\b
:可以使用组名来替代组的编号
零宽断言
用于查找某些内容,但又不占用这个位置,称为零宽断言。
(?=exp)
:比如\b\w+(?=ing)\b
可以匹配以ing结尾的前面部分,如dancing
会匹配danc
(?<=exp)
:比如(?<=\bre)\w+\b
可以匹配re开头的单词的后半部分,如reading
会匹配ading
负向零宽断言
表示某个字符或者某个字符串不在里面的方法,类似于[^abc]
,但这种方式只能判断单个字符,如果表示字符串不包含abc
整体,则要用到负向零宽断言
(?!exp)
:\b((?!abc)\w)+
表示不包含abc连续字符的单词
0x02 python re模块
re.compile(pattern, flags=0)
:编译正则表达式为一个对象,flag为标记为,可以使用|
进行结合,可能的值有如下几种:
re.A
、re.ASCII
:让\w
\W
\b
\B
\D
\d
s
\S
只匹配ASCII,忽略unicode
re.I
、re.IGNORECASE
:忽略匹配大小写
re.M
、re.MULTILINE
:匹配多行字符
常用函数
re.search(pattern, string, flag=0)
:扫描整个字符串,匹配到第一个就返回,并返回一个匹配对象,没有匹配返回None
1 | "(abc){2}",'abcabc') s = re.search( |
re.match(pattern, string, flag=0)
:从字符串开头进行匹配,并返回一个匹配对象,没有匹配返回None
1 | "abc\d+", "abc1") s = re.match( |
re.split(pattern, string, maxsplit=0, flags=0)
:用正则去分割字符串
1 | '[a-f]+', 'a1b2321c912d9') s = re.split( |
re.findalll(pattern, string, flags=0)
:将匹配到的返回一个列表组合
1 | 'abc', "abcskodqwabcjiabc") s = re.findall( |
分组
如果正则中有括号进行分组,可以用group加上编号进行读取
1 | r"(\w+) (\w+)", "Isaac Newton, physicist") m = re.match( |
分组号有名称
1 | r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds") m = re.match( |