re(正则)模块
1. 正则模块,在python中用来操作正则表达式的模块。用来校验字符串的合法性,爬虫等。
2. 正则表达式,是一种用来匹配字符串内容的规则。(工具:regex)
3. 元字符:一个字符所表示的内容
# 常用
. 匹配除了换行符以外的任意字符
\w 匹配字母数字或下划线
\s 匹配任意的空白符
\d 匹配数字
a|b 匹配字符a或字符b
()匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...]在字符集里表示匹配除了字符组中的所有字符
# 比较常用
\n 匹配换行符
^ 匹配字符串的开始
$ 匹配字符串的结尾
# 不太常用
\t 制表符
\b 匹配单词的结尾
\W 匹配非字母数字或下划线
\D 匹配非数字
\S 匹配非空白符
4. 量词:只表示前面一个字符的次数
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
5. 贪婪匹配: 字符+量词,每个量词只控制前面一个字符的出现次数,这个两次的匹配方式就是贪婪匹配(尽量多的匹配)
6. 非贪婪匹配: 字符+量词+?,常用 .*? + 任意字符,匹配到任意字符就返回
7. 分组:约束多个字符集匹配次数
8. 转义符,在正则里想表示换行符\n,需要写\\n,表示字符串"\n",要写\\\\n。
python中,r"正则表达式",取消python中的各种转义符,无需再次转义
9. 回溯算法:回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
正则的贪婪匹配本质就是回溯算法。
10. re模块的使用
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]) #查看剩余的左右结果
11. re模块中的findall、search、compile方法
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()方法取出来
12. re.findall()优先级问题
分组的优先匹配,优先显示,只显示分组里的内容
在分组里加 ?: 就可以全部显示了
13. re.split()优先级问题
如果先分组再分割,分隔符也会保留并输出
14. 分组
分组命名:(?P<name>\w+)
分组赋值:(?P=name) ?P<变量名>:只取到标签名
import re
ret = re.search("<\w+>\w+</\w+>","<h1>hello</h1>")
print(ret.group())
ret = re.search("<(?P<name>\w+)>\w+</(?P=name)>","<h1>hello</h1>")
print(ret.group()) # 全部取出来
print(ret.group("name")) # 只取标签名
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")) # 取到内容
分组的用途
对多个字符进行整体的量词约束
对于一条匹配的正则,只对其中我需要的内容进行分组