正则表达式和re模块
1. 正则式是客观存在的,用于匹配字符串的一种方法。多用于数据分析和爬虫。
正则是一种匹配规则,任何编程语言通用.
1.1 中括号[字符],所有的限定都是只表示一位
1.2 元字符\w \d \s 字符,数字,下划线
大写的 对应非,与上面一组即为全部
.是换行符之外的所有字符。
对应于python里的re.S可以匹配所有字符,是python的flags的标识符,默认是re.U,
\n \t 回车和制表符
^和$符 前者只针对开头内容往后匹配,后者永远写在最后
分组是对多个字符组做整体约束用的.在python中,分组优先,findall默认只显示括号里的字符,split会保留切割的刀子们
| 是两者取一,从左到右匹配,有了就停,所以要把长的规则放前面,不然就永远取不到长的了
[^]除了字符组内的,其他都匹配
1.3 量词 * 0到多
+ 1到多
? 1和0
{n} {n,} {n,m} n或n到m或n到无穷
1.4 转义的问题
如果带匹配的字符串里出现了上述元字符,就在正则的里面再加个\,且都在前面加个r,表示都是真实无转义
惰性匹配,在量词后面加问号,常用于.#?abc的意思是一直取下去,但是一旦遇到第一个abc就停。
默认正则是贪婪匹配直至最后一个符合要求的字符串才停
在python中使用正则规则,引入re模块
2. re模块
findall('正则规则','字符串')
得到一个列表,每一项都是字符串,得到全部目标字符串
ret=re.search('正则规则','字符串'),只能找到第一个就停止了
此时返回的内容不是想到的字符串,需要.group(),没有则报错
为了不报错,if ret:print(ret.group())
ret=re.match('正则规则','字符串'),从头的第一个字符开匹配
如果从第一个字符开始能匹配上就返回一个需要.group来获取实际值的变量,不能就返回None
此时返回的内容不是想到的字符串,需要.group(),没有则报错
为了不报错,if ret:print(ret.group())
re.split('','') 根据正则关系进行split
re.sub('正则规则','替换后','字符串',次数) 根据正则关系进替换
re.subn('正则规则','替换后','字符串') 根据正则关系进替换,返回字符串和替换的次数
re.complie('') 编译:内部存放一个正则规则,把这个正则规则编译赋值
obj = e.complie(''),再利用其寻找的时候,obj.searchu.(字符串)
当一个正则规则反复使用其规则特别长的时候使用
re.finditer(ret) 得到的是一个迭代器的地址,想取里面每一个的内容还是加.group()
当收到的结果特别多的时候,节约内存,使用迭代器
关于分组,python在search里自动可以通过group(位置数)取相应的内容
而对于findall则默认取分组内的内容,想取消默认则在分组的左括号后面加上一个'?:'
给正则的内容加一个分组括号,就会保留切割的依据并把它单独列为列表的一项
search 返回是一个值需要.group来显示,无则None此时再group则报错,取分组的内容,直接ret.group(),括号内为数字或名,命名:在分组最前面?P加括号内name。
注:::这里有一种用法是,如果想截取一段头尾相同的字符串,则给前面的分组命名,然后后面的复用这个名字,后面的分组写成:?P等于前面的name,或者是用序号:\1取第一组