re 正则表示式 
  正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

一、正则表达式的作用
1、给字符串进行模糊匹配,
2、对象就是字符串

二、字符匹配(普通字符,元字符)
1.普通字符:数字字符和英文字母和自身匹配
2.元字符:. ^ $ * + ? {} [] () | \
re.方法("规则","匹配的字符串")
. 匹配任意一个字符,除了\n换行符

三、匹配规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$'     匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*'     匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  结果为['abb''ab''a']
'+'     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab''abb']
'?'     匹配前一个字符1次或0
'{m}'   匹配前一个字符m次
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb''ab''abb']
'|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配,re.search("(abc){2}a(123|456)c""abcabca456c").group() 结果 abcabca456c
'\A'    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z'    匹配字符结尾,同$
'\d'    匹配数字0-9
'\D'    匹配非数字
'\w'    匹配[A-Za-z0-9]
'\W'    匹配非[A-Za-z0-9]
's'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
'(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{'province''3714''city''81''birthday''1993'}

  

四、演示示例

findall 用法

ps1:

1 #找出字符串中的数字
2 re.findall('\d+',"alex22jack33rain32sdfsd4")  #执行这段代码

执行结果:

1 ['22', '33', '32', '4']

ps2:

1
2
findall 找到匹配,返回所有匹配部分的列表(
re.findall("a..x","adsxaeyxsk19")   #找到所有以a开头,以x结尾的字符

执行结果:

1 ['adsx', 'aeyx']

ps3:

1 re.findall("I","I am LIST")   #匹配所有I的字符

执行结果:

1 ['I', 'I']

.  的作用:匹配任意的意思(一个点代表一个字符,有多个字符,就用多个点代替)

1 re.findall("a..x","adsfaeyxsk19")  #匹配以a开头,以x结尾的字符

执行结果:

1 ['aeyx']

^ 只能在字符串的开头去匹配

ps1:

1 re.findall("^a..x","adsxaeyxsk19")   #^ 只能在字符串的开头去匹配

执行结果:

1 ['adsx']

ps2:

1 re.findall("^I","I am LIST")   #匹配开头是I的字符

执行结果:

1 ['I']

以d开头,*匹配所有是d的

1 re.findall("^d*","dddddddd1ksdfgjdddddd")

执行结果:

1 ['dddddddd']

$ 匹配以什么结尾的字符

1 re.findall("a..x$","adsxaeyxsk19arrx")  #这里表示匹配以x结尾的字符

执行结果:

1 ['arrx']

* + ? {} 匹配重复的符号(贪婪匹配)

ps1:

1 re.findall("d*","adsxaeddddddddddddyxsk19arrx")   #* 紧挨着的字符,可以匹配无穷次

执行结果:

1 ['', 'd', '', '', '', '', 'dddddddddddd', '', '', '', '', '', '', '', '', '', '', '']

ps2:

1  re.findall("alex*","asdhfalexxx")   #*匹配以alex中,x结尾的所有x  ,因为*代表可以重复的符号

执行结果:

1 ['alexxx']

ps3:

1  re.findall("alex+","asdhfalexxx")      #+匹配以alex中,x结尾的所有x,因为+代表可以重复的符号

执行结果:

1 ['alexxx']

ps4:

1 re.findall("alex*","asdhfale")   # *可以代表什么都没有

执行结果:

1 ['ale']

ps5:

1 re.findall("alex?","asdhfalexxx")   #?代表0次或1次

执行结果:

1 ['alex']

ps6:

1 re.findall("alex?","asdhfale")     #?代表0次或1次

执行结果:

1 ['ale']

{} 想取多少次,就取多少次
{0,} ==*

1 re.findall("alex{1,}","asdhfalexx")

执行结果:

1 ['alexx']

{1,}==+

1 re.findall("alex{0,}","asdhfalexx")

执行结果:

1 ['alexx']

{0,1}==?

1  re.findall("alex{0,1}","asdhfalexx")

执行结果:

1 ['alex']

{6} 重复6次

1 re.findall("alex{6}","asdhfalexxxxxx")

执行结果:

1 ['alexxxxxx']

{0,6} 重复1,2,3,4,5,6

1  re.findall("alex{0,6}","asdhfalexx")

执行结果:

1 ['alexx']

[ ] 字符集 等于或的作用

ps1:

1  re.findall("x[yz]","xyuuuu")   

执行结果:

1 ['xy']

ps2:

1 re.findall("x[yz]","xyuuxzuu")  #或的作用

执行结果:

1 ['xy', 'xz']

ps3:

1 re.findall("x[yz]p","xypuuxzpuu")   #或的作用

执行结果:

1 ['xyp', 'xzp']

ps4:

1 re.findall("q[a-z]*","quo")    #匹配以a-z结束的字符

执行结果:

1 ['quo']

ps5:

1 re.findall("q[a-z]*","quogjgkjjhk")   #匹配以a-z所有的字符

执行结果:

1 ['quogjgkjjhk']

ps6:

1 re.findall("q[a-z]*","quogjgkjjhk9")  #匹配以a-z所有的字符

执行结果:

1 ['quogjgkjjhk']

ps7:

1 re.findall("q[0-9]*","quogjgkjjhk9")   #匹配以q开头挨着的0-9的字符,所以只有q

执行结果:

1 ['q']

ps8:

1 re.findall("q[0-9]*","q899uogjgkjjhk9")  #匹配以q开头挨着的0-9的字符,所以只有q899

执行结果:

1 ['q899']

[^] 就是不是他的都匹配上

1 re.findall("q[^a-z]","q213")   #只能匹配a-z之外的字符集

执行结果:

1 ['q2']

元字符\  就是让有意义的变成没有意义,让无意义的变成有意义

ps1:

1 re.findall("\d","12+(34*6+2-5*(2-1))")    #匹配任何十进制的数

执行结果:

1 ['1', '2', '3', '4', '6', '2', '5', '2', '1']

ps2:

1 re.findall("\d+","12+(34*6+2-5*(2-1))")   #匹配任何十进制的数

执行结果:

1 ['12', '34', '6', '2', '5', '2', '1']

ps3:

1 re.findall("[0-9]+","12+(34*6+2-5*(2-1))")   #匹配所有0-9的字符

执行结果:

1 ['12', '34', '6', '2', '5', '2', '1']

ps4:

1 re.findall("[\D]+","12+(34*6+2-5*(2-1))")  #匹配所有非数字

执行结果:

1 ['+(', '*', '+', '-', '*(', '-', '))']

字符匹配

ps1:

1 re.findall("\D+","hello world")    #\D匹配非数字字符

执行结果:

1 ['hello world']

ps2:

1 re.findall("\S+","hello world")   #\S 匹配非空的字符

执行结果:

1 ['hello', 'world']

ps3:

1 re.findall("\w","hello world_")   #\w 匹配任何字母数字字符

执行结果:

1 'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '_']

ps4:

1 re.findall("www.baidu","www/baidu")  #匹配任意字符

执行结果:

1 ['www/baidu']

ps5:

1 re.findall("www.baidu","wwwobaidu")  #匹配任意字符

执行结果:

1 ['wwwobaidu']

ps6:

1  re.findall("www.baidu","www\nbaidu")  ##匹配任意字符,但只有\n除外

执行结果:

1 []

ps7:

1 re.findall("www\.baidu","www.baidu")   #\去除元字特殊功能

执行结果:

1 ['www.baidu']

ps8:

1 re.findall("www\*baidu","www*baidu")   #\有特殊功能,可以转义

执行结果:

1 ['www*baidu']

匹配中间带有空格的字符

ps1:

1  re.findall(r"I\b","I am LIST")  re的r =\\ ,就相当转义两次

执行结果:

1 ['I']

ps2:

1 re.findall("I\\b","I am LIST")    #\\转义字符

执行结果:

1 ['I']

ps3:

python解释器\\ 两个,re转义\\ 两个,所以是\\\\ 四个

1 re.findall("c\\\\l","abc\lerwt")    #同时匹配c和l

执行结果:

1 ['c\\l']

ps4:

1 re.findall(r"c\\l","abc\lerwt")   #同时匹配c和l

执行结果:

1 ['c\\l']

| 就是或的意思

ps1:

1
re.findall(r"ka|b","sdjkasf")     #匹配ka或b

执行结果:

1 ['ka']

ps2:

1 re.findall(r"ka|b","sdjkbsf")   匹配ka或b

执行结果:

1 ['b']

ps3:

1 re.findall(r"ka|b","sdjka|bsf")   #匹配ka或b

执行结果:

1 ['ka', 'b']

元字符分组 ()

ps1:

1 re.findall("(abc)+","abcabc" )

执行结果:

1 ['abc']

ps2:

1 re.findall("(abc)+","abccccc" )

执行结果:

1 ['abc']

search 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

ps1:

1
re.search("(?P<name>\w+)","abcccc")

执行结果:

1 <_sre.SRE_Match object; span=(0, 6), match='abcccc'>  #匹配成功了,返回的就是对象

ps2:

1 re.search("\d+","sdfas34sdfg15")

执行结果:

1 <_sre.SRE_Match object; span=(5, 7), match='34'>

ps3:

1 re.search("\d+","sdfas34sdfg15").group()   #\d+ 是匹配数字

执行结果:

1 '34'

ps4:

1 re.search("(?P<name>[a-z]+)","alex36wusir34xialv33")  #<>的作用就是把内容进行分组

执行结果:

1 <_sre.SRE_Match object; span=(0, 4), match='alex'>

ps5:

1 re.search("(?P<name>[a-z]+)","alex36wusir34xialv33").group()   #group()匹配的内容取出来

执行结果:

1 'alex'

ps6:

1 re.search("[a-z]*","alex36wusir34xialv33").group()  #匹配包含a-z的内容

执行结果:

1 'alex'

ps7:

1 re.search("[a-z]+","alex36wusir34xialv33").group()   #匹配包含a-z的内容,+号的作用就是重复

执行结果:

1 'alex'

ps8:

1 re.search("(?P<name>[a-z]+)\d+","alex36wusir34xialv33").group("name")   #通过分组,可以给group传叁数,找出你想要的信息

执行结果:

1 'alex'

ps9:

1 re.search("(?P<name>[a-z]+)(?P<age>\d+)","alex36wusir34xialv33").group("age")  #通过分组找出你想要的信息

执行结果:

1 '36'

match

ps1:

1 re.match('a','abc').group()     #同search,不过尽在字符串开始处进行匹配

执行结果:

1 'a'

ps2:

1 re.match("\d+","56alex36wusir34xialv33")

执行结果:

1 <_sre.SRE_Match object; span=(0, 2), match='56'>

ps3:

1 re.match("\d+","56alex36wusir34xialv33").group()

执行结果:

1 '56'

split  分割

ps1:

1 ret=re.split('[ab]','abcd')     #先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
2 print(ret)

执行结果:

1 ['', '', 'cd']

ps2:

1 re.split(" ","hello abc def")   #匹配中间带有空格的

执行结果:

1 ['hello', 'abc', 'def']

ps3:

1 re.split("[ l]","hello abcldef")

执行结果:

1 ['he', '', 'o', 'abc', 'def']

ps4:

1 re.split("[ |]","hello abc|def")

执行结果:

1 ['hello', 'abc', 'def']

ps5:

1  re.split("[ab]","asdabcd")

执行结果:

1 ['', 'sd', '', 'cd']

ps6:

1 re.split("[ab]","abc")  #以自己为分界点,进行分隔,有的就以‘’ 填充

执行结果:

1 ['', '', 'c']

sub 替换

ps1:

1 re.sub("\d+","A","jaskd4234ashdjf5423")   #把所有数字替换为A(4234替换为A)

执行结果:

1 'jaskdAashdjfA' 

ps2:

1 re.sub("\d","A","jaskd4234ashdjf5423")   #把所有数字替换为A(4234替换为AAAA)

执行结果:

1 'jaskdAAAAashdjfAAAA'

ps3:

1 ret=re.sub('\d','abc','alvin5yuan6',1)  #把5替换成abc

执行结果:

1 alvinabcyuan6

ps4:

1 re.sub("\d","A","jaskd4234ashdjf5423",4)   #指定替换次数 4,只替换前面4个数字

执行结果:

1 'jaskdAAAAashdjf5423'

subn  第一个匹配元组,第二个匹配次数

ps1:

1 ret=re.subn('\d','abc','alvin5yuan6')    #第一个匹配元组,第二个匹配次数
2 print(ret)

执行结果:

1 ('alvinabcyuanabc', 2)

ps2:

1 re.subn("\d","A","jaskd4234ashdjf5423")  #第一个匹配元组,第二个匹配次数,8次

执行结果:

1 ('jaskdAAAAashdjfAAAA', 8)

compile 编译

ps1:

1 com=re.compile("\d+")     #编译好了一次,下次再用,直接就调用他,不用再编译,提高匹配速度
2 com.findall("fjlksad234hfjksd3421")   #可以匹配多次

执行结果:

1 ['234', '3421']

ps2:

1 obj=re.compile('\d{3}')
2 ret=obj.search('abc123eeee')
3 print(ret.group())

执行结果:

1 123

finditer(迭代器)当数据非常多的时候,他会把数据存在迭代器中,不会放在内存中,用一条处理一条。

ps1:

1 re.finditer("\d","sdfgs6345dkflfdg534jd")

执行结果:

1 <callable_iterator object at 0x01093710>        #返回的是迭代器对象

ps2:

 1 ret=re.finditer("\d","sdfgs6345dkflfdg534jd")  2 next(ret).group()      #拿到结果3 '6'4 next(ret).group()5 '3'6 next(ret).group()7 '4'8 next(ret).group()9 '5'
10 next(ret).group()
11 '5'
12 next(ret).group()
13 '3'
14 next(ret).group()
15 '4'

补充内容:

ps1:

1 ret=re.findall('www.(baidu|oldboy).com','www.oldboy.com')
2 print(ret)

执行结果:

1 ['oldboy']     #这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ps2:

1 re.findall("www\.(baidu|163)\.com","www.baidu.com")  

执行结果:

1 ['baidu']      #这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ps3:

1 re.findall("www\.(baidu|163)\.com","dfdsssfwww.baidu.comdsfsfs")

执行结果:

1 ['baidu']      #这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ps4:

1 re.findall("www\.(baidu|163)\.com","dfdsssfwww.163.comdsfsfs")

执行结果:

1 ['163']        #这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ps5:

1 ret=re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
2 print(ret)

执行结果:

1 ['www.oldboy.com']

ps6:

1 re.findall("www\.(?:baidu|163)\.com","dfdsssfwww.163.comdsfsfs")   #如果要匹配置全部网址,取消他的优化级,在前面加?:

执行结果:

1 ['www.163.com']

生产环境常见正则示例:

1、匹配手机号

1 phone_num = '13001000000'
2 a = re.compile(r"^1[\d+]{10}")
3 b = a.match(phone_num)
4 print(b.group())

2、匹配IPv4

1 # 匹配IP地址
2 ip = '192.168.1.1'
3 a = re.compile(r"(((1?[0-9]?[0-9])|(2[0-4][0-9])|(25[0-5]))\.){3}((1?[0-9]?[0-9])|(2[0-4][0-9])|(25[0-5]))$")
4 b = a.search(ip)
5 print(b)

3、匹配E-mail

1 email = '630571017@qq.com'
2 a = re.compile(r"(.*){0,26}@(\w+){0,20}.(\w+){0,8}")
3 b = a.search(email)
4 print(b.group())

转载于:https://www.cnblogs.com/lixiaoliuer/p/6389361.html

自成一派的正则表达式相关推荐

  1. python 颤音_自成一派,这个作曲大师确实名副其实!

    AWS DeepComposer 是一项教育型的 AWS 服务,可以训练出生成式人工智能,并利用 GAN(Generative Adversarial Network)转换输入的旋律,创作出完整的原创 ...

  2. NLP预训练家族 | 自成一派的GPT!

    作者 | 周俊贤 整理 | NewBeeNLP 之前我们梳理了NLP预训练家族系列文章,今天继续来看看另外一个分支,GPT系列! GPT2论文全称及链接:<Language Models are ...

  3. mysql查询提示_MySQL自成一派的查询提示

    [查询提示] MySQL中可以给select语句各种提示,比如告诉它"查询的结果集特别大,请直接用磁盘临时表","请让这条select优先执行" .... [查 ...

  4. 自成一派的风格楷体字体

    楷体又被称做是活体,是一种模仿手写习惯的一种字体,笔画挺秀均匀,字形端正,广泛地用于学生课本.通俗读物.批注等.楷体比起屏幕显示领域更多的是出现在创作设计上.小编今天要给大家推荐的是经过改善后可以广泛 ...

  5. Set与List的前辈是Collection,Map自成一派

    一.Set的内部是基于Map,其值存储在k中,由于key是唯一的,故Set内的值具有不可重复性 由于TreeSet中含有SortSet,故其值的存储是有序的(大多基于Tree的都是有序的) 二.Map ...

  6. 微信与此ipad不兼容电脑也显示设备版本过低9.0_全面升级 自成一派 iPadOS 14更新让你的iPad更好用...

    北京时间2020年6月23日凌晨1点,第31届苹果全球开发者大会(WWDC 2020)在线进行了首日演讲,期间来自155个国家和地区的2300多万名开发者,与苹果共同见证此次会议的召开.在会上公布了苹 ...

  7. Java笔试题解答和部分面试题

    面试类  银行类的问题 问题一:在多线程环境中使用HashMap会有什么问题?在什么情况下使用get()方法会产生无限循环? HashMap本身没有什么问题,有没有问题取决于你是如何使用它的.比如,你 ...

  8. MongoDB学习指导

    原文地址:http://blog.csdn.net/jakenson/article/details/7060431 MongoDB的内部构造<MongoDB The Definitive Gu ...

  9. 关于Mongodb的全面总结

    MongoDB的内部构造<MongoDB The Definitive Guide> MongoDB的官方文档基本是how to do的介绍,而关于how it worked却少之又少,本 ...

最新文章

  1. BERT不加载预训练模型的理由
  2. 程序21、程序22和程序23
  3. [转].NET 数字格式化:忽略末尾零
  4. 前端vscode插件合集
  5. jmeter php网站,jmeter实战之phpwind随机回帖/发帖
  6. java bitset_Java BitSet length()方法与示例
  7. Netty 5.X 官方指南翻译版6:Writing a Time Client
  8. 循证e刊 安慰剂的前世今生
  9. RecyclerView异步加载图片
  10. 基于xxx的系统实现
  11. echarts 饼图 将数据显示在图例的旁边
  12. java 汉字转拼音缩写_用JAVA实现汉字转拼音缩写
  13. IBM SPSS Statistics如何快速有效地录入数据
  14. Go语言的安装与环境配置
  15. 五、ELK设置用户密码登陆
  16. 《前端》阿里字体库iconfont使用方法
  17. 参考 | 升级 Win11 移动热点开不了或者开了连不上
  18. 一周上手flutter
  19. 南宁琅东的机器人餐厅_南宁这几家私房菜藏得深,人气却只增不减,真是菜香不怕巷子深~...
  20. 后端学习 - 操作系统

热门文章

  1. 英特尔芯片漏洞比想象中更严重:控制计算机无需密码
  2. python:savgol_filter的简单使用
  3. 基于Xcode8.x的CoreData的使用
  4. Candide3人脸动画模型
  5. selenium爬取网页表格数据并存到Excel
  6. 《失业七个月,面试六十家公司》的深圳体验
  7. 【VS问题已解决】警告被视为错误 - 没有生成“object”文件
  8. 匹兹堡大学约翰斯敦计算机学院,英语翻译翻译Every human being,no matter what he is doing,gives off...
  9. Nobody gives away anything valuable for free.
  10. 如何解决Access操作或事件已被禁用模式阻止