正则表达式: (是一种独立的语法,与python语言没有关系)
定义: 一种匹配字符串的规则
正则表达式的应用:
可以定制一个规则:
1.确定/判断某个字符串是否符合规则
2.在一大段字符串中找到符合规则的内容
程序领域:
1.登陆注册网页的表单 验证 web开发
2.爬虫,把网页的源码下载下来,做数据分析
3.自动化开发, 日志分析
帮助学习的测试工具 http://tool.chinaz.com/regex/ 站长工具
元字符
\d == [0-9] 匹配的是一个数字
\w == [0-9a-zA-Z_] 匹配的是字母数字下划线
\s == [\n \t 空格] 匹配回车 空格 制表符"Tab"
\D 匹配非数字
\W 匹配回车 空格 制表符
\S 匹配非空白
[\d\D], [\s\S], [\w\W] 匹配所有类型字符串
^ 判断是否是字符串开头,后面跟上要识别的内容
$ 判断是否是结尾,前面跟上内容
a|b 匹配 | 两端的字符a 或者字符b
. 匹配除了换行符以外的任意字符 (ps: 在爬虫中用的比较多)
() 分组,可以约束一组字符串
字符组 [ ]
在一个字符的位置上能出现的内容
例: [1cd] 是个范围, 代表这个位置的字符可以是1,c,d 中的任意一个
[0-9][A-Z][a-z] 匹配三个字符
[2-7abc] 匹配一个字符, 可以是2-7中的任意数字或者a,b,c中一个
[0-9A-Za-z] 匹配一个字符
ps: 匹配过程:从头开始匹配一个字符串,匹配到多少个,就返回多少条结果
量词:
? 匹配前一个字符0次或1次, 可有可无
+ 匹配前一个字符多次或一次
* 匹配前一个字符0次或多次, ?与+拼在一起
{n} 匹配前一个字符重复n次
{n, } 匹配前一个字符n+次, n次或更多次
{n,m} 匹配前一个字符重复n至m次
贪婪匹配:(正则表达式的默认匹配规则, 用的回溯算法) 在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配
仅带有*,+等都是贪婪匹配,也就是尽可能匹配,量词的后面加 ? 号使其变成惰性匹配
几种常用的非贪婪匹配:(惰性匹配)
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
训练:
<.*>
<.*?>
.^$
*+?{}
[ ]
分组()?与 或 | [^]
re模块
介绍:正则表达式内置在python中,需要用re模块调用出来
pattern......匹配的正则表达式
string.......要匹配的字符串。
flags......标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
RegexObject 正则表达式对象
常用匹配方法:
1. re.findall(pattern,string,flags=0) *****
把匹配到的字符以列表的形式返回
2. re.search(pattern,string,flags=0) *****
在string中寻找模式,仅返回一个值
3. re.match(pattern,string,flags=0) **
在string的开始处匹配模式
4. re.sub(pattern, repl, string, count=0, flags=0) ***
匹配字符并替换并可以控制替换次数
5. re.subn(pattern, repl, string, count=0, flags=0) ***
匹配字符并替换,可以控制替换次数,打印时会返回替换次数
6. re.split(pattern,string,maxsplit=0,flags=0) ***
匹配到的字符被当作列表的切割符,返回一个列表
7. re.compile(pattern) ***** (可以提高时间效率)
根据包含正则表达式的字符串 创建一个RegexObject,可以通过RegexObject进行re方法操作
8. re.finditer(pattern) ***** (可以提高空间效率)
返回一个迭代器 (用for循环迭代)
常用方法:
group() 获取一个或者多个分组匹配的字符串
groups() 获取全部分组的匹配的结果 放在一个元组里,可以只打印索引的结果
转义符
应用场景:假如匹配的文本中有"\",在正则表达式中就需要有"\\\\"
在python中有更简单的方法,在pattern或str前面加上 r 就代表转义
其他匹配模式:
re.I
忽略大小写
re.M
多行模式
re.S
点 任意模式
分组() 的应用:
在re.findall 中会优先显示分组中的内容, 想要取消分组内容优先,需要声明(?:pattern)
在re.split 中会保留切割符(被切掉的内容)
在re.search 如果有多个分组的pattern时,通过group(n)可以拿到索引对应的匹配到的内容
ret=re.findall(r"\d+(?:\.\d+)|(\d+)","1-2*(60+(-40.35/5)-(-4*3))") #显示所有整数
print(ret) #['1', '2', '60', '', '5', '4', '3']
正表达式进阶:
分组命名:
(?P<name>pattern) 表示给分组起名字
(?P=name) 表示使用这个分组,匹配到的内容ing该和分组中的内容完全相同 , 通常跟在(?P<name>pattern)的后面使用
标签匹配:
ret = re.search("<(?P<name>\w+)>\w+</(?P=name)>","<h1>hello</h1>")
print(ret.group('name')) #结果 :h1
print(ret.group()) #结果 :<h1>hello</h1>
ret = re.search(r'<(\w+)>(\w+)</(\w+)>',r'<a>wahaha</b>')
print(ret.group()) #<a>wahaha</b>
print(ret.group(1)) #a
print(ret.group(2)) #wahaha
print(ret.group(3)) #b
ret = re.search(r'<(?P<tag>\w+)>(?P<c>\w+)</(\w+)>',r'<a>wahaha</b>')
print(ret.group()) #<a>wahaha</b>
print(ret.group('tag')) #a
print(ret.group('c')) #wahaha
练习:
import re
st= re.findall('\d+',"adfhauo14145")
print(st)
st1 = re.search('\d+',"adfhauo14145")
if st1:print(st1.group())
st2 = re.match("\d+","1414adfhauo14145")
if st2:print(st2.group())
its = re.subn('\d','w','afajfj134jh41432')
print(its)
its1 = re.finditer('\d+','agfg14414ggh4gh1g4h1g4h1g4h1g4hg')
for r in its1:
print(r.group())
its3 = re.compile('\d+')
f = its3.finditer("fhagf245jh21443")
for r in f:print(r.group())
f1 = re.split("(\d)","ahfv3142bhbh25hb5h2v5")
print(f1)
转载于:https://www.cnblogs.com/sun-ming-ji/p/9438025.html
相关资源:Python3的re模块(正则表达式)