正则表达式的学习
作用:
开发数据抓取、网络爬虫等程序。
语法:
import re
re.__all__
查看正则表达式可调用的函数
函数:
p=re.compile(pattern,flags=0)
pattern 是正则表达式
flag 匹配的旗标,在后面会介绍(re.I,re.S等等)
编译正则表达式,一次编译,终身使用,对于处理多个相同操作的数据,可以使用这种方式,节省代码。
以后使用就可以直接p.search(str)
正则函数:
re.match(pattern,string,flags=0) 从字符串的头匹配
string 要匹配的字符串
返回_sre.SRE_MATCH对象
span() 返回匹配到的位置
group() 返回匹配到的内容
示例:
a=re.match(r'a','a') 前面的r只是为了表示原始字符串,可以没有的
<re.Match object; span=(0, 1), match='a'>
a.span() =>(0,1)
a.group() =>a
注意:匹配不到调用这两个方法会报错,匹配不到返回None
re.search(pattern,string,flags=0) 在字符串的全局匹配
同上,一样,找到一次就返回,不找第二个
re.findall(pattern,string,flags=0) 返回所有能匹配组成的列表
示例:
re.findall(r'a','a a a')
['a','a','a']
re.finditer(pattern,string,flags=0) 返回所有能匹配到的组成的迭代器
示例:
re.finditer(r'a','a a a')
<callable_iterator object at 0x00C6B7B0>
re.fullmatch(pattern,string,flags=0) 所有的相同就返回
示例:
re.fullmatch(r'a','a')
<re.Match object; span=(0, 1), match='a'>
注意:如果多个就不能匹配到
re.sub(pattern,repl,string,count=0,flags=0) 将匹配的替换成repl,count控制替换几个
返回字符串
re.split(pattern,string,maxsplit=0,flags=0) 划分字符串
返回划分好由列表组成的字符串
re.purge() 清除正则表达式缓存
re.escape(pattern) 对模式中除了ASCII字符、数值、下划线之外的其他字符转义
示例:
print(re.escape(r'A-Zand0-0?'))
A\-Zand0\-0\?
起组名:
r'(?P<lang>\w+)
分析:
正则表达式用圆括号表达式建了一个组
在组中,?P表示为该组起名,<lang>就是该组的名,后面跟要匹配的正则表达式。
补充:
在search()、match()、fullmatch()、findall()、finditer()方法都可以额外指定pos(匹配的起始位置)和endpos(匹配的结束位置),不过得先compile编译,再用flags就得需要关键字传参了
示例:
p=re.compile('a')
p.search('a b a',4)
<re.Match object; span=(4, 5), match='a'>
_sre.SRE_Match对象
包含以下属性或者方法:
match.group([group1,···]) 获取该匹配对象中指定组所匹配的字符串,不写参数代表全部,写参数代表第几个组中的字符串
match.groups(default=None) 返回所有组匹配组成的列表
match.groupdict(default=None)返回所有组匹配到组成的字典
得先给组起名字,字典的组成是{组名字:匹配到的内容}
实例:
m2=re.search(r'(?P<prefix>fkit).(?P<suffix>org)',r"www.fkit.org is good")
m2.groupdict()
{'prefix': 'fkit', 'suffix': 'org'}
match.start([group]) 返回组匹配到的起始位置
match.end([group]) 返回组匹配到的结束位置
match.span([group]) 返回组匹配到的起始和结束位置
组的概念:
在正则表达式中,用括号括起来的就是一个组(下标从1开始,0代表所有组【默认不写】)
查看设置参数的函数:
match.pos: 返回设置的起始位置
match.endpos: 返回设置的结束位置
match.lastindex:返回最后有个匹配组的索引
match.lastgroup:返回最后一个组的名字
match.re: 返回执行正则表达式的flag
match.string: 返回正则表达式匹配的字符串
正则表达式的旗标
re.A或re.ASCII 控制所有的,只匹配ASCII,可在正则表达式里面使用(?a)来代表
re.DEBUG 显示编译正则表达式的debug信息,无行内旗标
re.I或re.IGNORECASE 不区分大小写(?i)
re.L或re.LOCALE 根据当前区域设置使用不区分大小写。只能对bytes模式起作用(?L)
re.M或re.MULTILINE 多行模式的旗标,^、$能匹配多行的开头和结尾等(?m)
re.S或者s.DOTALL 让点能匹配换行符(?s)
re.U或者re.Unicode 匹配所有的Unicode,在python3是多余的,python默认就是Unicode
re.X或re.VERBOSE 允许分行书写正则表达式(?x)可以添加注释·
(?i)写在全局表示对全局起作用
写在 组里面表示对当前组起作用
(?-i)表示在当前组里面去掉
正则表达式支持的合法字符
字符 | 解释 |
x | 字符x(任意的合法字符) |
\uhhhh | 十六进制0xhhhh所代表的Unicode字符 |
\t | 制表符(’\u0009’) |
\n | 换行符(’\u000A’) |
\r | 回车符(’\u000D’) |
\f | 换夜符(’\u000C’) |
\a | 报警(bell)符(’\u0007’) |
\e | Escape符(’\u001B’) |
\cx | x对应的控制符。例如,\cM匹配Ctrl+M。x值必须为a-z或A-Z之一 |
特殊字符
特殊字符 | 说明 |
^ | 匹配行首(若要匹配,须转义) |
$ | 匹配行尾(同上) |
() | 组(同上) |
[] | 表示要匹配的范围(同上) |
{} | 出现频度(同上) |
* | 零次或多次(贪婪) |
+ | 一次或多次(贪婪) |
? | 零次或一次 |
. | 除了换行符之外的所有 |
\ | 转义字符 |
| | 或,两者之任一 |
预定义字符
预定义字符 | 说明 |
. | 除了换行符,在使用re.S(s.DOTALL)之后还可以匹配换行符 |
\d | 匹配数字(digit) |
\D | 匹配非数字 |
\s | 匹配只要是空白(space) |
\S | 除了空白 |
\w | 字母数字下划线(word) |
\W | 非上一个 |
方括号表达式
方括号表达式 | 说明 |
表示枚举 | [abc]表示abc任意一个 |
表示所有 | [a-z]从a到z |
表示求否:^ | [^a]除了a之外所有的 |
边界通配符 | 说明 |
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词的边界,只能匹配单词前后的空白 |
\B | 非单词的边界,即只能匹配不在单词前后的边界 |
\A | 只匹配字符串的开头 |
\Z | 只匹配字符串的结尾,用于最后的结束符 |
子表达式
(exp):表示匹配exp表达式,并捕获成一个自动命名的组,可以从\1,\2取
例如:
re.search(r'(a|b|c) \1','a a')
<re.Match object; span=(0, 3), match='a a'>
(?P<name>exp):为匹配的起别名,后面可通过(?P=name)匹配前面匹配到的
(?:exp):匹配但不捕获,所以不能通过\1引用
(?<=exp):左边的必须出现,但exp不作为匹配的一部分
(?=exp):右边的必须出现,但不匹配
(?<!exp):必须不出现在左边
(?!exp):必须不出现在右边
(?#comment):注释组,可以对前面的注释
(?旗标):旗标组,可以指定旗标,用在整个正则表达式
(?旗标:exp):子旗标组,用在当前的表达式中
(?-旗标:exp):表名去掉旗标
贪婪模式与勉强模式
贪婪模式:
是指在正则表达式中,如果不指定?,他会尽可能多的匹配,也就是只要能满足正则表达式,他会一直匹配下去,满足条件最大限度的匹配
勉强模式:
是贪婪模式的对立面,是尽可能的少匹配,只要满足正则表达式,能少匹配就少匹配
满足条件最小限度的匹配
两者的转化就在于:
贪婪模式的正则表达式后面加个(?)就是勉强模式