正则表达式

应用场景

- 特定规律字符串的查找,切割,替换
- 邮箱格式: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 P3410 拍照】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3410 这个题就是求一个最大权闭合图 在一个图中,一些点构成一个集合,且集合中的出边指向的终点也在这个集合中, ...

  2. 解决:fontawesome-webfont.woff2?v=4.6.3 404 (Not Found)

    用Bootstrap里面的字体,你项目中会报一个错,一个字体找不到,但我们的项目中却是存在这个字体的. 解决方法: 修改我们的Web.Config文件

  3. 微信小程序分包加载

    分包加载 某些情况下,开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载. 在构建小程序分包项目时,构建会输出一个或多个功能的分包,其中每个分包小程序必定含有一个主 ...

  4. android 学习笔记 杂记1

    getIntent().getExtras().get("intent"); 这个intent是数据包装的参数. 比如: Intent intent = new Intent(th ...

  5. android ListView 与GridView 学习总结(五)

    ListView的使用总结 基本使用:   步骤:在布局文件中定义一个ListView控件-在活动中获得ListView的实例-获得适配器adapter的实例并且传入三个参数-把适配器对象传递给lis ...

  6. 用HTML写伪类选择器,结构伪类选择器,伪元素选择器样式

    html,css lorem乱序铭文 Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nesciunt, nihil? Lorem ...

  7. Chino的成绩(chino的公开赛T3)

    题目背景 曾经幻想过未来的风景 或许有着另外一片天 小镇的远方 有着深远的回忆 也有着富有深情的诗篇 题目描述 Chino非常注重自己的成绩 Chino有 m 种方式给自己增加 rp 以增加成绩,她的 ...

  8. 【前行&赛时总结】◇第4站&赛时9◇ CF Round 513 Div1+Div2

    ◇第4站&赛时9◇ CF Round 513 Div1+Div2 第一次在CF里涨Rating QWQ 深感不易……作blog以记之 ( ̄▽ ̄)" +Codeforces 的门为你打 ...

  9. 【原创】面向对象作业:选课系统中用pickle储存多个对象间组合引用关系的那些坑

    转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9030121.html 想直接看结论先提前列出: 1.存储一个对象,文件不是真的给你存储的了对象这种东西, ...

  10. Percona-Tookit工具包之pt-table-sync

      Preface       We've used pt-table-checksum to checksum the different table data bwtween replicatio ...