re模块
正则表达式
http://tool.chinaz.com/regex正则表达式测试网站
-
从字符创中匹配符合规则的内容
-
字符组:[],写在中括号的内容,出现在下面的任意位置上都是符合规则的
-
[0-9]:数字
-
[a-z]:小写字母
-
[A-Z]:大写字母
-
[a-zA-Z]:所有字母
-
[a-zA-Z0-9]:所有字母数字
-
如果想要添加新的规则,只需要在后面加就可了,规则和规则之间没有任何的分割符
-
元字符
特殊转义
-
\w:数字字母下划线—word 关键字
-
\d:数字—digit 数字 [0-9]
-
\s:空白符(换行符[回车],制表符[table],空格)—space==[\n\t ]
-
\W:和上面的相反–>所有的非数字字母下换线
-
\D:所有的非数字字符
-
\S:所有的非空杯字符
-
[\s\S] [\d\B] [\s\S] :三组全集
-
\b:单词的边界
-
ing\b:匹配以"ing"结尾的
-
\bing:匹配以"ing"开头的
其他
-
^:匹配以一个字符串开始的
-
$:匹配以一个字符串结束的
- hello$:匹配以hello结束的字符串
-
^hello$:只匹配hello这个字符串,多一个,少一个都不行
-
.:匹配除了换行符之外的其他任意字符
-
[]:任意在这个括号里的
-
[^]:任意不在这个括号里的
-
a|b:或: 匹配符合a规则或者b规则的内容
- tips:由于匹配从左到右,所以:我们应该把比较苛刻的条件放在前面,不然,可能会造成前面的条件匹配完,后面的条件就失效了
re模块的基本方法
import re
"""
re模块:方法
1.查找类
fiandall:会匹配所有的结果,然后返回一个列表,每一个结果是列表的一个元素
ret = re.findall("[a-z]\d", "13a2s1d32asd1a3sd4a13sda3s5")
print(ret) # ['a2', 's1', 'd3', 'd1', 'a3', 'd4', 'a1', 'a3', 's5']
search:只会匹配从左到右的第一个结果,返回的是一个内存地址,需要用group方法查看查找结果
如果没有匹配到结果,使用group方法会报错
if ret:
print(ret.group())
match:mach方法相当于在search方法前面增加了一个‘^’,相当于是从头开始匹配,只匹配第一个结果
2.字符串处理扩展
split:切割:按照正则表达式对字符串进行切割,返回一个字符串
sub:替换:
re.sub(pattern, repl, string, count, flags)
pattern:正则表达式(想替换掉的内容)
repl:替换成的内容
string:待处理的字符串
subn:替换:大致和sub一样,唯一不一样的是,
会返回一个元组,元组的后一个元素是替换的次数
3.re模块的进阶,时间/空间
compile:节省使用正则表达式的时间
一次编译,一直使用,编译正则表达式,编译成字节码
在多次使用的过程中,不会多次编译
finditer:节省使用正则表达式的空间
把所有查询出来的结果放在一个迭代器里面,然后一个一个的拿出来用
"""
ret = re.findall("[a-z]\d", "13a2s1d32asd1a3sd4a13sda3s5")
ret1 = re.search("\d+", "13a2s1d32asd1a3sd4a13sda3s5")
ret2 = re.match("\d+", "13a2s1d32asd1a3sd4a13sda3s5")
ret3 = re.split("\d+", "das12weq45qwe4564ewqe12asd132f1a3s1d3a1sd")
ret4 = re.sub("[]]", "X", "123]456]789]", 2)
ret5 = re.subn("[]]", "X", "123]456]789]")
print(ret)
print(ret1)
print(ret1.group())
print(ret2.group())
print(ret3)
print(ret4)
print(ret5)
分组在re模块中的使用:
import re
s = '<a>hygwq</a>'
result = re.search("<(\w+)>(\w+)</(\w+)>", s)
print("result:", result.group())
print("result:", result.group(1))
print("result:", result.group(2))
result1 = re.findall(">(\w+)<", s)
print("result1:", result1)
result2 = re.findall("\d+(\.\d+)", "3.1415*46.456")
print("result2:", result2)
"""
显然,在上面的例子中,我们想拿到的是小数,但是由于优先级的关系,我们拿到了不论不类的东西
所以,我们有时候是不想让这个东西发生的
所以,我们可以取消分组优先级
语法:(?:正则表达式)
就是在分组的最开始,加一个“?:”
分组的意义:在正则表达式中,我们需要的是同一约束某一组数据的出现次数
所以,什么情况使用分组呢,自己的理解是,有一些,或者是一组的数据,我们希望他们同时出现或者同时不出现。
对于python来说,分组是必不可少的,它会帮助我们更精准的找到想要的内容
"""
result3 = re.findall("\d+(?:\.\d+)", "3.1415*46.456")
print("result:", result3)
"""
split:如果加入分组,则会在切割的时候,把切割掉的内容也保留下来
默认情况下:split会把要求的切了直接扔掉
在加入分组的时候:split会把扔掉的东西再拿回来
"""
result4 = re.split("\d+", "456we44dsf4s64we646fds6f")
print("result4:", result4)
result5 = re.split("(\d+)", "456we44dsf4s64we646f")
print("result5:", result5)
result6 = re.search(">(?P<name>\w+)<", "<a>hygwq</a>")
print("result6:", result6.group(1))
print("result6:", result6.group("name"))
"""
从上面的例子可以看出,给分组命名的基本语法,下面简单介绍分组命名用在哪里
1.如果我们想得到的字符串中有几个字符或者字符串必须是完全一样的
比如:时间格式
2019-11-18
2019.11.18
2018 11 18
2.判断类似标签语言的合法性
"""
html = '<a>hygwq</b>'
result7 = re.search("<(?P<name>\w+)>(\w+)</(?P=name)>", html)
print("result7:", result7)
以上代码的全部执行结果:
