搜索内容

Python学习-正则表达式!

Python学习-正则表达式!

 

下图列出了Python支持的正则表达式元字符和语法:

L3Byb3h5L2h0dHBzL2ltYWdlczIwMTUuY25ibG9ncy5jb20vYmxvZy8xMDg5NTA3LzIwMTcwMS8xMDg5NTA3LTIwMTcwMTA2MTA1NzEwNTgxLTkxNzAxMzAzMi5wbmc

字符点:匹配任意一个字符

  1. import re
  2. st = 'python'
  3. result = re.findall('p.t',st)
  4. print(result)

字符^:匹配以什么开头

  1. import re
  2. st = 'python'
  3. result = re.findall('^py',st)
  4. print(result)

字符$:匹配以什么结尾

  1. import re
  2. st = 'python'
  3. result = re.findall('n$',st)
  4. print(result)

字符*:匹配任意次,包括0次

  1. import re
  2. st = 'I looooooove python'
  3. result = re.findall('lo*ve',st)#字符0可以没有,也可以无限多个,都可以匹配
  4. print(result)

字符+:匹配一次或多次

  1. import re
  2. st = 'I looooooove python'
  3. result = re.findall('lo+ve',st)#字符0没有就匹配不上
  4. print(result)

字符?:匹配0次或一次

  1. import re
  2. st = 'I love python'
  3. result = re.findall('lo?ve',st)#字符0没有也能匹配
  4. print(result)

{m}:匹配前一个字符的m次

  1. import re
  2. st = 'I loooove python'
  3. result = re.findall('o{3}',st)#匹配3o字符
  4. print(result)

{m,n}:匹配前一个字符的m-n次

  1. import re
  2. st = 'I loooove python'
  3. result = re.findall('lo{1,4}ve',st)
  4. print(result)

[abc]或[a-c]:匹配[]中的任意一个字符

  1. import re
  2. st = 'I loooove python'
  3. result = re.findall('l[0-z]*e',st)
  4. print(result)

[a|b]:匹配字符a或字符b

  1. import re
  2. st = 'I lbve python'
  3. result = re.findall('l[a|b]ve',st)
  4. print(result)

[^1-9]:[]里出现^字符,表示非的意思,并不表示以什么开头的意思

  1. import re
  2. st = 'I lb2ve python6'
  3. result = re.findall('[^0-9]',st)
  4. print(result)
  5. ##########################################
  6. ['I', ' ', 'l', 'b', 'v', 'e', ' ', 'p', 'y', 't', 'h', 'o', 'n']

\:

  • 反斜杠后边跟元字符去除特殊功能
  • 反斜杠后边跟普通字符实现特殊功能
  • 引用序号对应的字组所匹配的字符串

数量词的贪婪模式与非贪婪模式

正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。

  1. import re
  2. result = re.findall(r'ab*','abbbc')
  3. print(result)
  4. ##########################################
  5. ['abbb']
  1. import re
  2. result = re.findall(r'ab*?','abbbc')#取消贪婪模式
  3. print(result)
  4. ##########################################
  5. ['a']

re.match() 从头匹配

  1. import re
  2. origin = "hello poe bcd jet who are you 20"
  3. r = re.match("h\w+",origin)
  4. print(r.group()) #获取匹配到的所有结果
  5. print(r.groups()) #获取模型中匹配到的分组结果
  6. print(r.groupdict()) #获取模型中匹配到的分组结果
  7. ##########################################
  8. hello
  9. ()
  10. {}
  1. r = re.match("(h)(\w+)",origin)
  2. print(r.group()) #获取匹配到的所有结果
  3. print(r.groups()) #获取模型中匹配到的分组结果
  4. print(r.groupdict()) #获取模型中匹配到的分组结果
  5. ##########################################
  6. hello
  7. ('h', 'ello')
  8. {}
  1. r = re.match("(?P<n1>h)(?P<n2>\w+)",origin)
  2. # ?P<n1> :以键为n1,值为匹配到的这个分组,保存到字典中!?P<>这个是固定的写法
  3. print(r.group()) #获取匹配到的所有结果
  4. print(r.groups()) #获取模型中匹配到的分组结果
  5. print(r.groupdict()) #获取模型中匹配到的分组结果
  6. ##########################################
  7. hello
  8. ('h', 'ello')
  9. {'n2': 'ello', 'n1': 'h'}

re.search() 浏览全部字符串,匹配第一个符合规则的字符串

与re.match()用法基本一样

  1. import re
  2. origin = "hello poe bcd jet poe who are you 20"
  3. r = re.search("p(\w+).*(?P<name>\d)$",origin)
  4. # ?P<n1> :以键为n1,值为匹配到的这个分组,保存到字典中!?P<>这个是固定的写法
  5. print(r.group()) #获取匹配到的所有结果
  6. print(r.groups()) #获取模型中匹配到的分组结果
  7. print(r.groupdict()) #获取模型中匹配到的分组结果
  8. ##########################################
  9. poe bcd jet poe who are you 20
  10. ('oe', '')
  11. {'name': ''}

re.findall() 将匹配的所有内容都放置在一个列表中

注:此方法空匹配也会保存到结果中,如:

  1. result = re.findall("","a2b3c4d5")
  2. print(result)
  3. print(len(result))
  4. ##########################################
  5. ['', '', '', '', '', '', '', '', '']

re.findall()方法要注意有分组的情况:

  1. #没有分组的情况
  2. r = re.findall("p\w+",origin)
  3. print(r)
  4. ##########################################
  5. ['poe', 'poe']
  1. #有分组的情况,会把匹配到的分组放到结果列表中
  2. r = re.findall("p(\w+)",origin)
  3. print(r)
  4. ##########################################
  5. ['oe', 'oe']

re.finditer()

  1. import re
  2. origin = "hello poe bcd jet poe who are you 20"
  3. r = re.finditer("(p)(\w+(e))",origin)
  4. for i in r :
  5. print(i.group())
  6. print(i.groups())
  7. print(i.groupdict())

re.split()

无分组情况,匹配到的字符串不会出现在匹配结果中:

  1. import re
  2. origin = "hello poe bcd jet poe who are you 20"
  3. r = re.split("a\w+",origin,1)
  4. print(r)
  5. ##########################################
  6. ['hello poe bcd jet poe who ', ' you 20']

有分组情况,匹配到的分组字符串也会出现在匹配结果中:

  1. import re
  2. origin = "hello poe bcd jet poe who are you 20"
  3. r = re.split("a(\w+)",origin,1)
  4. print(r)
  5. ##########################################
  6. ['hello poe bcd jet poe who ', 're', ' you 20']

re.sub() 正则替换

  1. import re
  2. origin = "1yiuoosfd234kuiuadf789v,xznfa978"
  3. new_str = re.sub("\d+","KKK",origin,1)#参数1表示只替换匹配到的第一个字符串,如果是2表示替换匹配到的前2个字符串
  4. print(new_str)
  5. ##########################################
  6. KKKyiuoosfdKKKkuiuadf789v,xznfa978

re.subn()只是比re.sub()多返回一个数据,如:

  1. import re
  2. origin = "1yiuoosfd234kuiuadf789v,xznfa978"
  3. new_str,count = re.subn("\d+","KKK",origin)#参数1表示只替换匹配到的第一个字符串
  4. print(new_str,count)
  5. ##########################################
  6. KKKyiuoosfdKKKkuiuadfKKKv,xznfaKKK 4

这个4表示替换匹配了4次

 

学习资料见知识星球。

以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。

快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利​​​​!

更多技巧, www.excelbook.cn

欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;

​​Win10系统关闭提示音的办法!

你将获得:

1、价值上万元的专业的PPT报告模板。

2、专业案例分析和解读笔记。

3、实用的Excel、Word、PPT技巧。

4、VIP讨论群,共享资源。

5、优惠的会员商品。

6、一次付费只需99元,即可下载本站文章涉及的文件和软件。

文章版权声明 1、本网站名称:Excelbook
2、本站永久网址:http://www.excelbook.cn
3、本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长王小琥进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报。
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。

THE END
分享
二维码
< <上一篇
下一篇>>
发表评论

共有 0 条评论

沙发空余