模块之正则
re模块--在python里操作正则表达式的模块
用途--验证字符串的合法性,爬虫
正则表达式--基本的东西
正则表达式是一种客观存在的一种规则
re模块是python提供的操作正则表达式的工具
正则表达式就是匹配字符串内容的一种规则(工具:regex)
字符集---[多种可能]--表示一个字符的位置--# 多种可能可以是范围--必须是从小到大
元字符--占一个字符所表示的内容
重点,常用
. 匹配除了换行符以外的任意字符
\w 匹配字母数字或下划线
\s 匹配任意的空白符
\d 匹配数字
a|b 匹配字符a或字符b
()匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...]在字符集里表示匹配除了字符组中的所有字符
比较常用
\n 匹配换行符
^ 匹配字符串的开始
$ 匹配字符串的结尾
不太常用
\t 制表符
\b 匹配单词的结尾
\W 匹配非字母数字或下划线
\D 匹配非数字
\S 匹配非空白符
量词--只表示前面一个字符的次数
* 重复零次或更多次
+ 重复一次或更多次
?重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
规则:#贪婪匹配(字符+量词):
每个量词只控制前面一个字符的出现次数
这个量词的匹配方式就是贪婪匹配(尽量多的匹配,能匹配多少匹配多少)
非贪婪匹配: 字符+量词+?
常用: .*? + 任意字符,匹配到任意字符就返回
分组:约束多个字符集匹配次数
转义符
在正则里想表示换行符\n,需要写\\n,想表示字符串"\n",要写 \\\\n
python的规则:r"放正则表达式"---取消python里的各种转义符
回溯算法---正则贪婪匹配的本质就是回溯算法
re模块
import re ret = re.findall("正则表达式","要匹配的字符串")---直接返回一个列表,每个结果都是字符串,找不到返回空列表 print(ret) ret2 = re.search("正则表达式","要匹配的字符串")---匹配找到的第一个结果,找不到返回None if ret2: print(ret2.group()) ret3 = re.match("正则表达式","要匹配的字符串")---只匹配从头开始匹配到的值,找不到返回None if ret3: print(ret3.group())
小结:
在调用的角度上看没有区别,接受两个参数按照位置传,正则表达式和要匹配的字符串
返回值的区别:
re.findall()---列表,匹配到的所有内容都会出现在列表中,如果没有匹配到返回空列表
re.search()--如果匹配到结果返回第一个匹配到的,如果没有匹配到返回None
--返回值用group()方法取出来
re.match()--只匹配从头开始匹配到的第一个值,如果没有匹配到返回None
--返回值用group()方法取出来
import re re.split("[ab]","afdbndf")---先按a去分割,再按b去分割 import re re.sub("新的","旧的","需要替换的内容","次数")---替换 import re ret = re.subn('\d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次) print(ret) import re obj = re.compile('\d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字 ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串 print(ret.group()) #结果 : 123 import re ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器 print(ret) # <callable_iterator object at 0x10195f940> print(next(ret).group()) #查看第一个结果 print(next(ret).group()) #查看第二个结果 print([i.group() for i in ret]) #查看剩余的左右结果
re.findall()优先级问题:
分组的优先匹配,优先显示,只显示分组里的内容
在分组里加 ?: 就可以全部显示了
re.split()优先级问题:
如果先分组再分割,分隔符也会保留并输出
标签语言
分组命名 #分组命名:(?P<name>\w+),分组赋值:(?P=name)
?P<变量名>---只取到标签名
import re ret = re.search("<\w+>\w+</\w+>","<h1>hello</h1>") print(ret.group()) import re ret = re.search("<(?P<name>\w+)>\w+</(?P=name)>","<h1>hello</h1>") print(ret.group())#---全部取出来 print(ret.group("name"))#---只取标签名 #分组命名:(?P<name>\w+),分组赋值:(?P=name) import re ret = re.search("<(?P<name>\w+)>(?P<a>\w+)</(?P=name)>","<h1>hello</h1>") print(ret.group())#---全部取出来 print(ret.group("name"))#---只取标签名 print(ret.group("a"))#---取到内容
分组的用途
对多个字符进行整体的量词约束
对于一条匹配的正则,只对其中我需要的内容进行分组
浙公网安备 33010602011771号