(4条消息) import re

元字符

px* 可以匹配 p px px...
px+ 可以匹配 px px... 但是不能匹配到p

默认的匹配都是贪婪匹配
贪婪匹配就是一次匹配尽可能多的内容

比如正则是 'aoe+'  要匹配的字符串是 'aoeeeeee'  它可以匹配到aoeeeeee
但是如果正则是 'aoe+?' 的话 它只能匹配到'aoe'
?放在+ * {n,m}是取消贪婪匹配的 

同时?也是匹配0或1次

\ 是转义符
可以让有特殊意义的元字符失效  比如\. 只是用来匹配. 而不是除换行之外的任意单个字符
可以让普通字符具有特殊意义    比如\d 不是用来匹配字母d,而是用来匹配单个数字0-9  等价于[0-9]

^a.*b$ 同时满足以a开头以b结尾
[] 正则中学名叫 字符集
[abc] 匹配a或b或c 中的其中一个
[a-c] -用于表示范围 效果和上面的相同  顺序是按照ascii码排的
[^abc] 匹配除a或b或c之外的任意一个字符

一些应用

?P<f>\b\w+\b 是说给 \b\w+\b 这段正则命名为f
匹配AA这种形式的(?P<f>\b\w+\b)(?P=f)

关于分组

首先是分组的扩展语法

正则中()是用来分组的

一般用match和search这两个方法匹配关于分组的正则
match和search方法匹配成功后会返回match对象

print(re.search("(\d{3})(\w+)(\d{3})","123abcd123"))
# <_sre.SRE_Match object; span=(0, 10), match='123abcd123'>

match对象的主要方法

groups() 将匹配到的内容分组 放到元组中 然后返回这个元组

print(re.search("(\d{3})(\w+)(\d{3})","123abcd123").groups())
('123', 'abcd', '123')

group() 返回内容

print(re.search("(\d{3})(\w+)(\d{3})","123abcd123").group(0))
print(re.search("(\d{3})(\w+)(\d{3})","123abcd123").group())
# 返回大正则匹配到的内容

print(re.search("(\d{3})(\w+)(\d{3})","123abcd123").group(1))   # 第一组
print(re.search("(\d{3})(\w+)(\d{3})","123abcd123").group(2))   # 第二组
print(re.search("(\d{3})(\w+)(\d{3})","123abcd123").group(3))   # 第三组

# 如果这里将分组命名的话
print(re.search("(?P<abc>\d{3})(?P<zzz>\w+)(?P=abc)","123abcd123").group("abc"))    # 123
print(re.search("(?P<abc>\d{3})(?P<zzz>\w+)(?P=abc)","123abcd123").group("zzz"))    # abcd

# 前面(?P<abc>\d{3}) 就是将该分组命名为abc
# 后面如果要匹配相同的内容的话 可以额(?P=abc)
# group()可以通过传入组名来获取匹配到的内容

print(re.search("(?P<abc>\d{3})(?P<zzz>\w+)(?P=abc)","123abcd123").group('abc',"zzz"))
# ('123', 'abcd')
# 传入多个组号或组名 可以返回多个元素组成的元素

groupdict() 组名为key 匹配到的内容为value

print(re.search("(?P<abc>\d{3})(?P<zzz>\w+)(?P=abc)","123abcd123").groupdict())
# {'abc': '123', 'zzz': 'abcd'}

start() 返回指定分组的起始索引位置

print(re.search("(?P<abc>\d{3})(?P<zzz>\w+)(?P=abc)","123abcd123").start(1))
print(re.search("(?P<abc>\d{3})(?P<zzz>\w+)(?P=abc)","123abcd123").start(2))
print(re.search("(?P<abc>\d{3})(?P<zzz>\w+)(?P=abc)","123abcd123").start("abc"))
print(re.search("(?P<abc>\d{3})(?P<zzz>\w+)(?P=abc)","123abcd123").start("zzz"))

# 执行结果
0
3
0
3

end() 返回指定分组的结束为止的前一个为止

print(re.search("(?P<abc>\d{3})(?P<zzz>\w+)(?P=abc)","123abcd123").end(2))  # 7
print(re.search("(?P<abc>\d{3})(?P<zzz>\w+)(?P=abc)","123abcd123").end("zzz"))  # 7

re模块方法

正则表达式对象

# 不适用正则对象的话
print(re.findall("\d+","123abc123"))
# ['123', '123']

# 使用正则对象的话
com = re.compile("\d+")  # 规则
print(com.findall("123abc123"))  # 结果通过规则来调用方法
# ['123', '123']

# 把规则提出来,然后进行重复调用

match search findall

sub subn

sub还可以指定替换次数(第三个参数)

split

一个re.split的坑

print(re.split("[ab]","abc"))       # ['', '', 'c']
# 首先按a来分'abc' a左边没有内容 就为''
# 右边有bc 现在分出来 '' 和 'bc' 两部分
# 然后按b来分 b来分'bc' 左边没有内容 就为''
# 右边有一个'c' 所以最后得到 ['', '', 'c']

###########################################################
print(re.split("[ab]","asdabcd"))
# 首先按a来分'asdabcd' 左边为空 右边为sdabcd
# 然后按a来分右边为sdabcd 左边为sd 右边为bcd
# 然后按b来分 bcd 左边为 '' 右边为 cd
# 所以结果是 ['','sd','','cd']
(0)

相关推荐

  • python 4-1-2 正则表达式一张图清晰归纳和实现细节

    python 4-1-2 正则表达式一张图清晰归纳和实现细节 ben1949 2017-01-18 08:50:55 1892 收藏 分类专栏: python实战 版权 python 正则表达式一张图 ...

  • 说说Python中贪婪和非贪婪匹配?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助!小猿会从最基础的面试题开始,每 ...

  • python笔记52-re正则匹配search

    前言 re.search扫描整个字符串并返回第一个成功的匹配.re.findall返回字符串中所有不重叠匹配项的列表,如果没有匹配到返回空list不会报错. search匹配对象有3个方法:group ...

  • Python|split()方法

    问题描述Python split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串语法split() 方法语法:str.split(str="& ...

  • (4条消息) python中import re

    一.什么是正则表达式? 正则表达式,又称规则表达式,通常被用来检索.替换那些符合某个模式(规则)的文本. 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合, ...

  • (7条消息) C++中位运算的使用方法

    一:简介1 位逻辑运算符:& (位   "与")  and^  (位   "异或")|   (位    "或")   or~  (位 ...

  • (35条消息) 中国城域网路由情况介绍

    中国的城域网,大概有三张比较典型的,一个是中国移动的CMnet,一个是中国电信IP城域网,还有一个是中国网通IP城域网.作为接入最后的阵地,城域网的业务是最复杂的.含盖了IPTV,语音,Interne ...

  • (35条消息) 家用宽带网络与服务器使用的网络有什么不同?

    很多人都知道,服务器的网络跟家用网络有很多区别.其中有很多技术大牛,都是使用家里的宽带做很多别人使用公网服务器才能完成的服务. 但是对于普通人来讲,似乎都觉得没什么区别,本文就此简单做一下区分: 固定 ...

  • 怎么设置微信公众号添加关注后自动回复多条消息

    怎么设置微信公众号添加关注后自动回复多条消息

  • (40条消息) 5G网络(接入网+承载网+核心网)

    前一段时间自己一直在做某市的5G试点项目,对5G的无线接入网相关技术有了更深入的认识.因此,希望通过无线接入网为线索(行话叫锚点),帮大家梳理一下无线侧接入网+承载网+核心网的架构,这里以接入网为主, ...

  • (7条消息) 国家信息化体系六要素

    历史的温度:寻找历史背面的故事.热血和真性情作者:张玮出版社:中信出版集团股份有限公司好评:100% 销售量:0 ¥34.3 历史的温度2:细节里的故事.彷徨和信念作者:张玮出版社:中信出版集团股份有 ...

  • (7条消息) QStringLiteral

    QStringLieral是Qt5中新引入的一个用来从"字符串常量"创建QString对象的宏(字符串常量指在源码中由双引号包含的字符串).在这篇博客我讲解释它的的内部实现和工作原 ...

  • (40条消息) Fastly释Lucet原生WebAssembly编译程序和Runtime

    云端服务供货商Fastly释出Lucet开源项目,这是原生的WebAssembly编译程序和Runtime,目的是要将WebAssembly带出浏览器,在开发者的应用程序中,安全地执行不受信任的Web ...