正则表达式

应用场景

- 特定规律字符串的查找,切割,替换
- 邮箱格式:URl,IP地址等的校验
- 爬虫项目中,特定内容的提取 使用原则 - 只要使用字符串等函数能解决的问题,就不要使用正则
- 正则的效率比较低,同时会降低代码的可读性
- 世界上最难理解的三样东西,医生的处方,道士的神符,码农的正则
- 提醒: 正则是用来写的,不是用来读的,在不指定功能的情况下,不要试图阅读别人的正则 基本使用 - 说明: 正则不是我们写的,python中正则的解析通过 re模块完成
- 相关函数;
- match: 从开头进行匹配,匹配到就返回正则结果对象,没有返回None
- sertch:从任意位置匹配,功能同上
import re # m = re.match("abc","adask;jabcsdaj1")
m1 = re.match("abc","abcsk;jadasdaj1")
# print(m) # 没有找到返回None
# print(m1)# 找到正则匹配结果对象,
if m1:
print(m1.group()) # 返回匹配的内容
print(m1.span()) #返回匹配的内容位置
"""
# match 从开头查找
# """
#
s = re.search("abc","adask;jabcsdaj1d")
# print(s) - findall : 有就返回所有匹配对象,组成列表,没有返回空列表
# 匹配所有内容,找到返回所有匹配的内容列表,
# 没有找到返回空列表
f = re.findall("abcd","adask;jabcsdabcaj1")
# print(f)
- compile : 生成正则表达式对象
# 先生成正则表达式对象
c = re.compile("hello")
# print(type(c)) # 从开头匹配
i = c.match("sad;asdawafhelloasdaw;asdw")
print(i) # 从任意位置匹配
se = c.search("sasdwdhelloasd;asdas")
print(se) # 匹配所有内容
fi = c.findall("helloadad;asdahello;asdfkajehelloasda")
print(fi)
- 说明 ,此方式更加灵活,将正则匹配分为两步完成(先生成正则对象,然后需要时进行验证) 正则规则 - 单个字符
- "普通字符:简单来说就是一对一的完全匹配"
[]:中间的任意一个字符
[a-z]: a~z之间的任意字符(所有的小写字母)
[A-Za-z]:匹配所有的字母,多个连续的片段中间不能有任何多余的字符
[^0-9]: 匹配 除了0-9 以外的所有字符
. (点): 匹配除 \n 以外的任意字符
自行测试:
\d :数字字符 ,相当于[0-9]
\D :非数字字符 ,相当于[^0-9]
\w :匹配字(数字,字母,下划线,汉字)
\W :匹配非字,(\w相反的内容)
\s :所有的空白字符
\S :所有的非空白字符
\b :词边界 (开头。结尾,空格,标点等)
\B :非词边界(\b相反的内容)
- 次数限定:
- # 指定字符任意次
# f = re.findall("ab*c","sabfabibabuabcbbavadba")
# 指定字符至少一次
print(re.findall("ab+c","sdhasjhfsljabcasofjia"))
# 指定字符最多出现一次,有或者没有都可以
print(re.findall("ab?c","sdhasjhfsljacasofjia"))
# #指定字符出现指定次数
print(re.findall("ab{3}c","sdhasjhabbbcfsljacasofjia"))
# 指定字符 出现次数的范围
print(re.findall("ab{1,3}c","sdhabbbcsjhabcfslfjia"))
# 指定字符,至多出现多少次
# print(re.findall("ab{0,5}c","sacaabcabcabcabia"))
# 指定字符,至少出现多少次
print(re.findall("ab{3,}c","sdhabbchfsljaca"))
*:前面的字符出现任意次
+:至少一次
?:最多一次
{m,n}:m <= 次数 <= n
{m,}:至少m次
{,n}:至多n次
{m}:指定m次 - 边界限定
- ^ : 以指定内容从开头进行匹配
- $ : 以指定内容从结尾进行匹配-p
import re
# ^ : 以指定内容从开头进行匹配
print( re.findall("^hello","adahelloaawhellowadhello"))
# $ : 以指定内容从结尾进行匹配
print( re.findall("hello$","adahelloaawhellowadhellxo")) - 优先级控制
- | 表示或,它拥有最低的优先级
- () 表示一个整体,可以明确的指定结合性/优先级
import re
print(re.findall("a(hello|world)c","hiahellociaworldc")
- 分组匹配
c = re.compile(r"(\d+)([a-z]+)(\d+)")
s = c.search("sadasdaf454as6aa46sd4w") """
完整匹配结果
print(s.group())
↑↓等价
print(s.group(0))
"""
# 第几个()匹配的结果
print(s.group(1), s.span(1))
print(s.group(2), s.span(2))
print(s.group(3), s.span(3))
- 示例2:
import re # 固定匹配
# c = re.compile(r'<a>\w+</a>') # \1表示前面第一个()匹配的内容
# c = re.compile(r'<([a-z]+)><([a-z]+)>\w+</\2></\1>') # 给分组()起名字
c = re.compile(r'<(?P<goudan>[a-z]+)><(?P<dahua>[a-z]+)>\w+</(?P=dahua)></(?P=goudan)>') s = c.search('<div><a>百度一下</a></div>') if s:
print(s.group()) - 贪婪匹配
- 贪婪 : 最大限度的匹配,正则的匹配默认就是贪婪。
- 非贪婪: 只要满足条件, 能少匹配就少匹配。? 经常用于取消贪婪
import re
# ? :取消任意多次的贪婪匹配
# c = re.compile(r"a.*?b")
# s = c.search("wwa0a0dwaadavab")
# ?:取消至少一次的贪婪匹配
c = re.compile(r"a.+?b")
s = c.search("wwa0abwaadavab")
if s:
print(s.group()) - 匹配模式
- 说明: 匹配模式就是匹配的原则进行模式的修正
import re
"""
flags: 标志位,用于控制正则表达式的匹配方式,值如下:
re.I 忽略大小写(常用)
re.L 做本地户识别
re.M 多行匹配,影响^和$(常用)
re.S 是. 匹配包括换行符 \n 在内的所有字符(常用)
re.U 根据Unicode字符集解析字符,影响 r"\w \W \b \B"(常用)
re.X 使我们以更灵活的格式理解正则表达式 (常用)
"""
# 忽略大小写re.I
s = re.search(r'hello', 'HELLO world', re.I) # 正则默认是单行匹配,使用 re.M 可以进行多行匹配
s = re.search(r'^hello', 'sdhasdh\nhello world', re.M) # 使.匹配任意字符,作为单行处理,忽略\n
# string = '<div>hello</div>'
string = '''<div>
hello
</div>'''
s = re.search(r'<div>.*?</div>', string, re.S) if s:
print(s.group()) - findall
import re # 没有(),结果集中保存完整匹配的内容
# f = re.findall('abc', 'abcdasabcakdjklasjabc')
# 与上面的情况等价
# f = re.findall('(abc)', 'abcdasabcakdjklasjabc')
# 按照正则进行完整匹配,但是结果集只显示分组内容
# f = re.findall('qq(abc)ww', 'ahdakqqabcwwhsad')
# 按照正则进行完整匹配,但是结果集中的元素时分组信息组成的元组
# f = re.findall('qq(abc)(ww)', 'ahdakqqabcwwhsaqqabcwwd')
# 满足上面所有的规律
# f = re.findall('(qq(abc)(ww))', 'ahdakqqabcwwhsaqqabcwwd')
# 匹配:'a(hello)c' 或 'a(world)c'
# f = re.findall('a(hello|world)c', 'sadahellocshdjaworldcsd')
f = re.findall('(a(hello|world)c)', 'sadahellocshdjaworldcsd') print(f)
- split
import re c = re.compile(r'\d') s = '正则其实不难1但是学完之后2发现写不出来3是这样吧' # 按照正则规律进行切割,可以指定切割次数
ret = c.split(s, 1) print(ret)
- sub
import re '''
c = re.compile(r'\d') # 使用特点内容替换正则匹配到的内容,可以指定替换次数
ret = c.sub(' ', 'how1are2you', 2) print(ret)
''' def double(s):
# print(s)
return str(int(s.group()) * 2) # 可以人为的干预正则替换的过程
# 因此需要传递一个处理的(匿名)函数
ret = re.sub(r'\d', double, 'how1are2you')
print(ret) - 转义问题
import re # 匹配所有正则语法中涉及的字符都需要转义 '''
# python: \\\\d \\\d r'\\d'
# re: \\d \\d \\d
# 匹配: \d \d \d
# c = re.compile('\\\\d')
# c = re.compile('\\\d')
# 推荐使用,否则你需要多写好多\
c = re.compile(r'\\d') s = c.search('\d') if s:
print(s.group())
''' '''
c = re.compile(r'\\b') # 在匹配的字符串中有特殊意义的字符也需要进行转义
# 若不想转义最好前面添加字符'r'
s = c.search(r'\b') if s:
print(s.group())
''' # 了解
# c = re.compile(r'\bhello')
# 单独匹配边界,findall保存的结果全都是空白
c = re.compile(r'\b') f = c.findall('hello,sdjaks') print(f)
1. 使用正则时,python字符串有特殊意义的字符最好转义
2. 要匹配在正则语法中有特殊函数的字符,都需要进行转义
3. 字符串前添加'r',可以使其变为原始字符,不要考虑转义问题

python 学习总结----正则表达式的更多相关文章

  1. [Python学习笔记]正则表达式总结

    常用缩写字符及其含义表格查询 缩写字符分类 含义 \d 0-9的任意数字 \D 除0-9的数字以外的任何字符 \w 任何字母.数字或下划线字符(可以认为是匹配"单词"字符) \W ...

  2. Python学习 之 正则表达式

    1.简单的正则表达式 import re s=r'abc' re.findall(s,"aaaaaaaaaaaaaaa") #结果为[] re.findall(s,"ab ...

  3. Python学习笔记——正则表达式入门

    # 本文对正则知识不做详细解释,仅作入门级的正则知识目录. 正则表达式的强大早有耳闻,大一时参加一次选拔考试,题目就是用做个HTML解析器,正则的优势表现得淋漓尽致.题外话不多讲,直接上干货: 1. ...

  4. Python学习--16 正则表达式

    正则表达式是一种描述性的语言,用来匹配字符串.凡是符合规则的字符串,我们认为就是匹配了. 正则表达式并非Python独有的,它与语言无关.很多语言都支持正则表达式. 我们经常用正则表达式来匹配电子邮件 ...

  5. python学习日记(正则表达式)

    定义 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Pyth ...

  6. python学习笔记----正则表达式

    正则: regular expression 常用的场景: #正则的包 >>> import re #match:开头匹配,匹配到,返回一个匹配对象,否则返回None >> ...

  7. python学习笔记——正则表达式regex

    1 概述 1.1 定义 本质是由一系列字符和特殊符号组成的字串,用来表示一定规则的某一类字符串. 1.2 特点 正则表达式是一个独立的技术,其在多种编程语言中使用. 在python语言中的正则表达式模 ...

  8. Python学习 :正则表达式

    正则表达式 python 使用正则表达式(re)来进行匹配引擎搜索 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串” 关于正则表达式 ...

  9. python学习-53 正则表达式

    正则表达式 就其本质而言,正则表达式是一种小型的/高度专业化的编程语言,它内嵌在python中,并通过RE模块实现,正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行. 1.元字符 - ...

随机推荐

  1. 【luogu P1774 最接近神的人_NOI导刊2010提高(02)】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1774 归并排序求逆序对. #include <cstdio> #define livelove ...

  2. [luoguP3325][HNOI2012]矿场搭建

    P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...

  3. 在body中的AngularJS模块

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  4. spring(一)-基本概念

    1.定义与特点 定义:一个分模块的一站式后台开发框架. 特征: (1)比起EJB,更轻量级别的容器框架,模块形式组织,只需要调用相应模块(jdbc.springmvc) (2)Spring IOC低耦 ...

  5. Oracle EM12c 安装

    EM12c系统由下列组件构成: 1.Oracle Management Agent(管理代理) 2.Oracle Management Service(管理服务) 3.Oracle Managemen ...

  6. java之递归学习

    递归思想(2018-10-22): 递归就是方法里调用自身 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口 递归算法代码显得很简洁,但递归算法解题的运行效率较低.所以不提倡用递归设计程序 ...

  7. vue、html与iframe html事件相互调用

    一.html文件中引入的iframe标签 1.在父html中调用子iframe html 中的事件 通过contentwindow属性 document.getElementById("my ...

  8. Spirng+SpringMVC+Mybatis(一)

    实习之后都是在别人搭配好环境的情况下进行一些业务的编写,脑袋已经不记得如何搭建一个ssm项目的,所以周末有空补了一下. 首先新建一个test数据库,并且在里面插入三条数据.如图下 编写一个User B ...

  9. checked="checked"无效,radio未选中问题排查

    在使用attr给元素设置属性的时候,但是显示在页面就是未选中,而且是只使用一两次是ok的,但是连着多使用就不起作用了,百度了下,发现遇到这个问题的人还蛮多的, 有人说,发现在jQuery1.6版本之后 ...

  10. thinkphp 下多图ajax上传图片

    碰到一个项目,有一个比较繁琐的功能6个ajax上传,基本上每个上传逻辑多不一样,记录一下 thinkphp的view页面: id方便找到这个元素 name一定要加 [ ] <div class= ...