微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

re模块和正则表达式

一、正则表达式:

  官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

  在线测试工具:http://tool.oschina.net/regex/  

  方法规则:

  1、字符组

  2、字符

  3、量词

字符
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线符
\s 匹配空格符
\d 匹配数字符
\W 匹配非字母或数字或下划线符
\S 匹配非空格符
\D 匹配非数字符
\n 匹配换行符
\t 匹配制表符(tab)
\b 匹配一个单词的结尾
^ 匹配字符串的开头字符  
$ 匹配字符串的结尾字符
a|b 匹配字符a或字符b,长字符放前面
() 匹配括号内的表达式,也可以表示一个
[...] 匹配字符组中的字符
[^...] 匹配非字符组内以外的所有字符
字符组
正则 待匹配结果 匹配结果 说明
[0123456789] 8 True
一个字符组里枚举合法的所有字符,字符组里的任意一个字符
和"待匹配字符"相同都视为可以匹配
[0123456789] a False
由于字符组中没有"a"字符,所以不能匹配
[0-9] 7 True
也可以用-表示范围,[0-9]就和[0123456789]是一个意思
[a-z] s True
同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示
[A-Z] B True
[A-Z]就表示所有的大写字母
[0-9a-fA-F] e True
可以匹配数字,大小写形式的a~f,用来验证十六进制字符

 

量词 用法说明 注意
* 重复零次或更多次 认贪婪匹配,后面加?变惰性匹配
+ 重复一次或更多次 认贪婪匹配,后面加?变惰性匹配
重复零次或一次  
{n} 重复n次 添加内容ps:加\表示转义
{n,} 重复n次或更多次 在字符串前加r,正则不转义
{n,m} 重复n到m次  

 

  特点:

    1、^与$符连用,会精准限制匹配的内容,两者中间些什么,匹配的字符串就必须啥,无多勿少

    2、正则在匹配的时候哦认贪婪匹配,可以在量词后面加?,转成惰性匹配

    3、量词必须跟在正则符号的后面,且量词只能够跟限制紧挨着它的哪一个正则符号

二、正则和re模块关系:

  1、正则表达式不是python独有,它是一门独立的技术

  所有编程语言否可以使用正则

  但是如在python中使用,就必须依赖re模块

  2、在python应用场景:

    1.爬虫

    2.数据分析

  3、用法

    先调用 import re

    1、re.findall

res = re.findall([a-z]+,eva egon jason)
# findall(‘正则表达式‘,‘带匹配的字符串‘)
print(res)  # 输出 [‘eva‘,‘egon‘,‘jason‘]
# 找出字符串中符合正则表达式全部内容 并且返回的是一个列表,列表中的元素就是正则匹配到的结果

    忽略分组有限机制

ret1 = re.findall(www.(baidu|oldboy).com,www.oldboy.com)
ret2 = re.findall(www.(?:baidu|oldboy).com,www.oldboy.com)  # 忽略分组优先的机制
print(ret1,ret2)  # [‘oldboy‘]     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

   2、re.search     一般用if判断取值连用

res = re.search(a,eva egon jason)
print(res)  # search不会给你直接返回匹配到的结果 而是给你返回一个对象
print(res.group())  # 必须调用group才能看到匹配到的结果
‘‘‘
输出结果
<_sre.SRE_Match object; span=(2,3),match=‘a‘>
a
‘‘‘
注意:
1.search只会依据正则查一次 只要查到了结果 就不会再往后查找
2.当查找的结果不存在的情况下 调用group直接报错

   3、re.match

res = re.match(a,eva egon jason)
print(res)
print(res.group())
"""
注意:
    1.match只会匹配字符串的开头部分
    2.当字符串的开头不符合匹配规则的情况下 返回的也是None 调用group也会报错
"""

   4、re.split

ret = re.split([ab],abcd)  # 先按‘a‘分割得到‘‘和‘bcd‘,在对‘‘和‘bcd‘分别按‘b‘分割
print(ret)  # [‘‘,‘‘,‘cd‘] 返回的还是列表

   

ret=re.split("\d+","eva3egon4yuan")
print(ret) #结果 : [‘eva‘,‘yuan‘]

ret1=re.split("(\d+)","eva3egon4yuan")
print(ret1) #结果 : [‘eva‘,‘3‘,‘4‘,‘yuan‘]

 

   5、re.sub / re.subn

ret = re.sub(\d,H,eva3egon4yuan4,1)  # 将数字替换成‘H‘,参数1表示只替换1个
# sub(‘正则表达式‘,‘新的内容‘,‘待替换的字符串‘,n)
"""
先按照正则表达式查找所有符合该表达式的内容 统一替换成‘新的内容‘  还可以通过n来控制替换的个数
"""
print(ret)  # evaHegon4yuan4

ret = re.subn(\d,eva3egon4yuan4)  # 将数字替换成‘H‘,返回元组(替换的结果,替换了多少次)
ret1 = re.subn(\d,1)  # 将数字替换成‘H‘,返回元组(替换的结果,替换了多少次)
print(ret,ret1)  # 返回的是一个元组 元组的第二个元素代表的是替换的个数
#(‘evaHegonHyuanH‘,(‘evaHegon4yuan4‘,1)    

   6、re.compile

obj = re.compile(\d{3})  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search(abc123eeee) #正则表达式对象调用search,参数为待匹配的字符串
res1 = obj.findall(347982734729349827384)
print(ret.group())  #结果 : 123
print(res1)  #结果 : [‘347‘,‘982‘,‘734‘,‘729‘,‘349‘,‘827‘,‘384‘]

   7、re.finditer

import re
ret = re.finditer(\d,ds3sy4784a)   #finditer返回一个存放匹配结果的迭代器
print(ret)  # <callable_iterator object at 0x10195f940>
print(next(ret).group())  # 等价于ret.__next__()

print([i.group() for i in ret])  #可查看剩余的左右结果

   8、可以给正则表达式起别名

import re
res = re.search(^[1-9](\d{14})(\d{2}[0-9x])?$,110105199812067023)
# 还可以给某一个正则表达式起别名

res1 = re.search(^[1-9](?P<password>\d{14})(?P<username>\d{2}[0-9x])?$,110105199812067023)
# print(res.group())
print(res1.group(password))  # 等于 print(res1.group(1))
print(res1.group(username)) # 等于print(res1.group(2))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐