专栏首页python3正则表达式 整理(\w \s \d 点

正则表达式 整理(\w \s \d 点

re.findall  匹配到正则表达式的字符,匹配到的每个字符存入一个列表,返回一个匹配到的所有字符列表

一. 匹配单个字符

import re
# \w 匹配所有字母、数字、下划线
re.findall('\w','abcd_123    *-')
# 结果为:['a', 'b', 'c', 'd', '_', '1', '2', '3']


# \s 匹配所有不可见字符
#  不可见字符有:\n \t 空格
re.findall('\s','abcd \n\tdf21  ')
# 结果为:[' ', '\n', '\t', ' ', ' ']


# \d 匹配所有数字
re.findall('\d','a1bc3 4d \n\tdf21  ')
# 结果为:['1', '3', '4', '2', '1']


# . 匹配\n换行符以外的所有可见和不可见字符
re.findall('.', 'c3 d\n\td1')
# 结果为:['c', '3', ' ', 'd', '\t', 'd', '1']

二. 匹配多个字符

#匹配多个字符:* + ?
import re
#  * 匹配0或n次
re.findall('\d*', '1a23')
# 结果为:['1', '', '23', '']


#  + 匹配1或n次
re.findall('\d+', '1a23')
# 结果为:['1', '23']
#前面2个是叫贪婪匹配


#  ? 匹配0或1次
re.findall('\d?', '1a3')
# 结果为:['1', '', '3', '']
# 这个叫非贪婪匹配

三. 匹配指定范围字符

# {m,n} 匹配最少m次,最多n次
# {m} 只匹配m次的
# {,n}  匹配最大n次,最小次数不限
# {m,}  匹配最小m次,最大次数不限
re.findall('\d{2,4}', '1a33g134nn12345')
# 结果为:['33', '134', '1234']
re.findall('a{3}', '1aaa3*G+1aaaan#b')
# 结果为:['aaa', 'aaa']


# | 匹配 或 语法的字符
re.findall('1|23|4', '1a33g134nn12345')
# 结果为:['1', '1', '4', '1', '23', '4']


# [ ] 匹配括号内的字符(只匹配单个)
re.findall('[123]', '1a33g134nn12345')
# 结果为:['1', '3', '3', '1', '3', '1', '2', '3']
re.findall('[0-9a-zA-Z]', '1a3*G+1n#')
# 匹配0到9或者a到z或者A到Z单个字符
# 结果为:['1', 'a', '3', 'G', '1', 'n']


# ^x 行首匹配
# x$ 行尾匹配
re.findall('^1', '1a3*G+1n#b')
re.findall('1$', '1a3*G+1n#b')
# 结果为:['1']     
# 结果为:['b']

. 一些比较不常见的匹配 1、\b 单词边界,重点理解在于‘边界’二字,‘单词’代表匹配的字符串,

  划定边界基本原则:比如表达式为 '\b单词\b'   的意思就是匹配字符串为‘单词’,单词两边需要存在满足条件的边界才能匹配成功。匹配失败结果肯定是空列表,匹配成功结果就是匹配的单词字符串列表。

  \b在哪边就限制哪边的匹配。

  匹配成功的边界满足条件跟匹配单词字符串有关联,双方是同一类型则失败,不同类型则成功

# 正则表达式中的\b可以用匹配目标单词字符串,加设限制匹配边界
# 单词的 前边界:'\b单词'
#     后边界:'单词\b'
#     前和后边界:'\b单词\b'
# 在\b的使用中有这样几点是需要格外注意的。
# 0. \b本身的含义就有转义字符串的作用,要用字符边界就得将其原始含义去掉,所以需要加r或者\\b(两个不能一起用)

# 1. 单词字符串能否匹配成功是有规律的:
# 如果是a-z,A-Z,0-9,则匹配边界为非字母数字才能匹配成功。
# 如果是非字母数字,则匹配边界为a-z,A-Z,0-9才能匹配成功。
# 如果是两个混在一起,判断标准为那个挨着\b最近的字符作为判断标准,如果是字母数字,则匹配边界为非字母数字才成功,反之亦然。
import re
s='aa abcperty/-aa '
res1=re.findall(r'\babc',s)    # 结果:['abc'] 单词为字母,左匹配边界为非字母数字,匹配成功
res2=re.findall(r'abc\b',s)    # 结果:[]      单词为字母,右匹配边界为字母,匹配失败
print(res1,res2)

s='aa@# perty/-aa '
res3=re.findall(r'\b@#',s)     # 结果:['@#']  单词为非字母数字,左匹配边界为字母,匹配成功
res4=re.findall(r'@#\b',s)     # 结果:[]      单词为非字母数字,右匹配边界为空格(非字母数字),匹配失败
print(res3,res4)

s='aa@a perty/-aa '
res5=re.findall(r'\b@a',s)     # 结果:['@a']  单词为混合,@挨着\b,单词以非字母数字为标准,左匹配边界为字母,匹配成功
res6=re.findall(r'@a\b',s)     # 结果:['@a']  单词为混合,a挨着\b,单词以字母数字为标准,右匹配边界为空格,匹配成功
print(res5,res6)

# 2.字符串的首尾边界默认定义为 非字母数字,所以如果匹配的单词字符串在首尾,则匹配字母数字则会成功,匹配非字母数字失败。
s= 'abcd@'
res7 = re.findall(r'\ba',s)    # 结果:['a'] 单词为字母,左匹配边界为首,默认定义为非字母数字,匹配成功
res8 = re.findall(r'@\b',s)    # 结果:[] 单词为非字母数字,右匹配边界为尾,默认定义为非字母数字,匹配失败
print(res7,res8)

五. 分组

用小括号表示,分组后的正则表达式优先匹配并返回括号内的值

六. re模块常用方法

re.search   查找,匹配成功返回第一匹配的字符串,结果为封装的对象(注意search返回的是个对象,.group() 后得到的是字符串不是列表),失败返回None

import re
s = 'welcome world hello python'
res = re.search('hello', s)
print(res)
print(res.group())

# 结果:
<_sre.SRE_Match object; span=(14, 19), match='hello'>
hello

re.match  匹配,在行首匹配字符串,方法同search,区别在于,match在行首匹配,search是从前到后全部查找匹配。

s = 'hello welcome world hello python'
res=re.match('hello', s)
print(res)
print(res.group())
res1=re.match('welcome',s)
print(res1)

# 结果:
<_sre.SRE_Match object; span=(0, 5), match='hello'>
hello
None

re.split  用匹配成功的字符串作为切割符,进行原字符串的切割,返回一个切割后的列表。匹配失败,直接返回原字符串,不做任何切割处理

匹配成功完成切割
s1 = 'hello welchhome world hello python'
res=re.split('h.+?o',s1)
print(res)

# 结果:
['', ' welc', 'me world ', ' python']

匹配不成功,返回原字符串。不做任何切割处理
s1 = 'hello welchhome world hello python'
res0=re.findall('json',s1)
print(res0)
res=re.split('json',s1)
print(res)

# 结果:
[]
['hello welchhome world hello python']

re.compile 将正则表达式封装成对象,用于重复使用该表达式。使用方法看例子:

s1 = 'hello welchhome world hello python'
pat=re.compile('h.+?o')
res2=pat.findall(s1)
print(res2)

# 结果:
['hello', 'hho', 'hello']

re.sub 替换,重组(group(1)、group(2)...group(n)用\1  \2  ...\n来替换,进行字符串的重新组合(前面要加r防止其转义))

s='<我的博客地址https://www.cnblogs.com/oldboy2019/,欢迎大家来访问、交流,欢迎大家一起探讨python!ohye!>'
# pat=re.compile(r'<(.+)http://(www.+/),.+>')
pat=re.compile(r'<(.+)http.+(www.+/),(.+?)([a-z]+)!(.+)!>')
print(pat.findall(s))
res=pat.sub(r'\2\n这是\1,\4,\5\3',s)
print(res)

# 结果:
[('我的博客地址', 'www.cnblogs.com/oldboy2019/', '欢迎大家来访问、交流,欢迎大家一起探讨', 'python', 'ohye')]
www.cnblogs.com/oldboy2019/
这是我的博客地址,python,ohye欢迎大家来访问、交流,欢迎大家一起探讨

#注意,这里第二个打印我在前面加了个原义字符r,但是里面\n还是转义成了换行,很奇怪,这个地方欢迎一起交流,为何会出现这种情况呢?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 第23天 常用模块四

    应用一:将字符串的alex make love的第一个字符串和第三个字符串进行替换====》love make alex

    py3study
  • 第一章:正则表达式

      正则表达式是由一堆字符和特殊符号组成的字符串。它可以为我们提供高级的文本搜索,匹配,替换功能。当然,正则表达式也不是python独有的一种模式,而是凌驾于语...

    py3study
  • python学习--正则表达式

    正则表达式是一种用来匹配字符串的强有力的工具它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串...

    py3study
  • Java学习笔记—开源框架Netty的简单使用

    Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序...

    慕容千语
  • Scala学习笔记(三)Scala的基础语法总结

    Scala 由于没有 Java 的三目运算符(?:),不过好在可以用 if/else 表达式替代它。

    fengzhizi715
  • scala与java之间的那些事

      scala与java之间的关系,我认为可以用一句话来开头:scala来源于java,但又高于java。   scala的设计者Martin Odersky就...

    随机来个数
  • 爬虫必学知识之正则表达式上篇

    这是日常学python的第12篇文章 在向网页进行了提交请求之类的之后,我们可以得到了网页的返回内容,里面自然而然会有我们想要的数据,但是html元素文本这么多...

    sergiojune
  • 【Nature 重磅】谷歌 DeepMind 发布可微分神经计算机 DNC,深度学习推理能力或大幅提升

    【新智元导读】谷歌 DeepMind 团队设计了一种叫做可微分神经计算机(DNC)的神经网络模型,结合神经网络与可读写的外部存储器,能够像神经网络那样通过试错或...

    新智元
  • Scala入门与进阶(五)- Scala数组

    Meet相识
  • 非主流域名 “汽车”auto.io结拍

    近日,域名auto.io在海外拍了1万美元,约6.5万元。

    躲在树上的域小名

扫码关注云+社区

领取腾讯云代金券