1. re模块

1.1 转义符

正则表达式中的转义符在python的字符串中也刚好有转移的作用,但是正则表达式中的转义符和字符串中的转义符并没关系,且还容易有冲突。

为了避免这种冲突,我们所有的正则都以在工具中的测试结果为结果,然后只需要在正则和待匹配的字符串外面都加r即可

print('\\\\n')   # \\n
print('\\n') # \n print(r'\\n') # \\n
print(r'\n') # \n

1.2re模块的方法

1.2.1 re.findall()

findall 会匹配字符串中所有符合规则的项,并返回一个列表,如果未匹配到,则返回空列表。

import re

ret = re.findall('\d+','alex83')
print(ret)

1.2.2 re.search()

search 会从头到尾从带匹配匹配字符串中取出第一个符合条件的项,如果匹配到了,返回一个对象,用group取值;如果没匹配到,返回None,不能用group取值。

import re

ret = re.search('\d+','alex83')
print(ret) # 如果能匹配上返回一个对象,如果不能匹配上返回None
if ret:
print(ret.group()) # 如果是对象,那么这个对象内部实现了group,所以可以取值
# 如果是None,那么这个对象不可能实现了group方法,所以报错

1.2.3 re.match()

match 会从头匹配字符串中取出从第一个字符开始是否符合规则,如果符合,就返回对象,用group取值;如果不符合,就返回None.

match = search + ^正则

import re

ret = re.match('\d','alex83') == re.match('^\d','alex83')
print(ret)

1.2.4 进阶方法

  • 1.时间复杂度 效率 compile

    在同一个正则表达式重复使用多次的时候使用能够减少时间的开销

  • 2.空间复杂度 内存占用率 finditer

    在查询的结果超过1个的情况下,能够有效的节省内存,降低空间复杂度,从而也降低了时间复杂度

  • 3.用户体验

1.2.5 re.finditer()

import re

ret = re.findall('\d','safhl02urhefy023908'*20000000)  # 时间复杂度、空间复杂度都非常高
print(ret) ret = re.finditer('\d','safhl02urhefy023908'*20000000) # ret是迭代器
for i in ret: # 迭代出来的每一项都是一个对象
print(i.group()) # 通过group取值即可

1.2.6 re.compile()

import re

ret = re.compile('\d3')  # 先配置好正则
print(ret)
r1 = ret.search('alex83') # 可以直接调用
print(r1)
ret.findall('wusir74') ret = re.compile('\d+')
r3 = ret.finditer('taibai40')
for i in r3:
print(i.group()) \d 正则表达式 ——> 字符串
\d str
循环str,找到所有的数字

1.2.7 re.split() 切割

import re

ret = re.split('\d+','alex83wusir74taibai')
print(ret) # ['alex', 'wusir', 'taibai'] ret = re.split('\d(\d)','alex83wusir74taibai') # 默认自动保留分组中的内容(被切割掉的内容)
print(ret) # ['alex', '3', 'wusir', '4', 'taibai']

1.2.8 re.sub() / re.subn() 替换

import re

ret = re.sub('\d','D','alex83wusir74taibai',1)
print(ret) # alexD3wusir74taibai ret = re.sub('\d','D','alex83wusir74taibai',3) # 3表示替换掉几个
print(ret) # alexDDwusirD4taibai ret = re.subn('\d','D','alex83wusir74taibai') # subn 直接全部替换的
print(ret) # ('alexDDwusirDDtaibai', 4) # 得到一个元组,并把一共替换掉几个作为元组的一个元素

1.3 分组的概念和re模块

1.3.1 分组命名

s1 = '<h1>wahaha</h1>'
s2 = '<a>wahaha ya wahaha</a>'
# s1 -> h1 wahaha
# s2 -> a wahaha ya wahaha
import re # 方法一
ret = re.search('<(\w+)>(.*?)</\w+>',s1)
print(ret)
print(ret.group(0)) # group参数默认为0 表示取整个正则匹配的结果
print(ret.group(1)) # 取第一个分组中的内容
print(ret.group(2)) # 取第二个分组中的内容 # 方法二(分组命名)
ret = re.search('<(?P<tag>\w+)>(?P<cont>.*?)</\w+>',s1)
print(ret)
print(ret.group('tag')) # 取tag分组中的内容
print(ret.group('cont')) # 取cont分组中的内容

分组命名:

(?P<名字>正则表达式)

1.3.2 引用分组

引用分组 (?P=组名) 这个组中的内容必须完全和之前已经存在的组匹配到的内容一模一样

s1 = '<h1>wahaha</h1>'
s2 = '<a>wahaha ya wahaha</a>'
ret = re.search('<(?P<tag>\w+)>.*?</(?P=tag)>',s1) # 用于约束前后<>内的内容一致
print(ret.group('tag')) # h1 # \1:转义1,表示分组中的
s1 = '<h1>wahaha</h1>'
s2 = '<a>wahaha ya wahaha</a>'
ret = re.search(r'<(\w+)>.*?</\1>',s1)
print(ret.group(1)) # h1

findall 遇到分组

findall 遇到正则表达式中的分组,会优先显示分组中的内容

import re

ret = re.findall('\d(\d)','aa1alex83')
# findall遇到正则表达式中的分组,会优先显示分组中的内容
print(ret) ret = re.findall('\d+(?:\.\d+)?','1.234+2') # ?: 取消分组优先显示
print(ret)

分组和 findall

  • 默认findall 优先显示分组内的内容
  • 取消分组优先显示 (?:正则)
# 例题
# 有的时候我们想匹配的内容包含在不相匹配的内容当中,这个时候只需要把不想匹配的先匹配出来,再通过手段去掉
import re
ret=re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret)
ret.remove('')
print(ret)

split 遇到分组:会保留分组中本来应该被切割掉的内容

1.4 生成器的send方法

def func():
print(123)
n = yield 'aaa'
print('-->',n)
yield 'bbb' g = func()
print(g)
n = next(g)
print(n)
print('-'*20)
next(g) # g.send('uysdfhfoiusyg')与next(g)的作用一样

1.5 小总结

正则 ?都能做什么?

    1. ?表示匹配0次或1次 表示可有可无 但是有只能有一个 比如小数点
    2. 用于非贪婪匹配:.*?x 匹配任意的内容任意多次遇到x就立即停止
    3. 分组命名: (?P<名字>正则表达式)
    4. 引用分组: (?P=组名)
    5. findall 遇到正则表达式中的分组时,?: 取消分组优先显示

python re模块与正则的更多相关文章

  1. python——re模块(正则表达)

    python——re模块(正则表达) 两个比较不错的正则帖子: http://blog.csdn.net/riba2534/article/details/54288552 http://blog.c ...

  2. Python之模块、正则

    一.模块import 模块的实质就是把要导入模块里面的代码,从上到下执行一遍,找模块的顺序是,先从当前目录下找,找不到的话,再环境变量里面找导入的模块名字最好不要有.,a.import sysprin ...

  3. python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

    python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess ...

  4. Day05 - Python 常用模块

    1. 模块简介 模块就是一个保存了 Python 代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 模块也是 Python 对象,具有随机的名字属性用来绑定或引用. 下例是个简单的模 ...

  5. python常用模块(1):collections模块和re模块(正则表达式详解)

    从今天开始我们就要开始学习python的模块,今天先介绍两个常用模块collections和re模块.还有非常重要的正则表达式,今天学习的正则表达式需要记忆的东西非常多,希望大家可以认真记忆.按常理来 ...

  6. Python xml 模块

    Python xml 模块 TOC 什么是xml? xml和json的区别 xml现今的应用 xml的解析方式 xml.etree.ElementTree SAX(xml.parsers.expat) ...

  7. Python re 模块

    Python re 模块 TOC 介绍 作用 正则表达式语法 贪婪和非贪婪 普通字符和特殊字符 分组(比较重要) re modul level 方法 正则表达式对象 匹配对象 常用例子 注意事项 Ja ...

  8. 更强大的python正则表达式模块 -- regex

    python内置的正则表达库re比较弱,而且似乎在好几年里都没太大的变化. 这里介绍这个python模块regex,实现了更多方便好用的功能. 比如:\p{han} 可以匹配汉字, \p{Latin} ...

  9. Learning-Python【21】:Python常用模块(4)—— re、logging、hashlib、subprocess

    re 模块:与正则相关的模块 在使用 re 模块之前,需要先了解正则表达式(regular expression),描述了一种字符串匹配的模式(pattern),可以用来检查一个字符串是否含有某个子字 ...

随机推荐

  1. backbone源代码注释(部分)

    // Backbone.js 1.0.0 // (c) 2010-2013 Jeremy Ashkenas, DocumentCloud Inc. // Backbone may be freely ...

  2. FastDFS的介绍

    FastDFS的介绍 FastDFS FastDFS是由国人余庆所开发,其项目地址: https://github.com/happyfish100 FastDFS是一个轻量级的开源分布式文件系统,主 ...

  3. 在Linux环境下使用OpenSSL对消息和文件进行加密(转载)

    转自:http://netsecurity.51cto.com/art/201301/378513.htm 1.简介 OpenSSL是一款功能强大的加密工具包.我们当中许多人已经在使用OpenSSL, ...

  4. python实现对某招聘网接口测试获取平台信息

    """通过接口测试的技术获取某招聘网平台的资料"""url = "https://www.lagou.com/jobs/posit ...

  5. n阶完全生成图的数量

    有些事不是看到了希望才去坚持,而是坚持了才会看到希望 问题 I: 星际之门(一) 时间限制: Sec 内存限制: MB 提交: 解决: [提交][状态][讨论版] 题目描述 公元3000年,子虚帝国统 ...

  6. json和Jsonp 使用总结(1)

    1.Json的使用 $.getJSON("subPreview", { jsonDatas: JSON.stringify(jsonData) }, function(data) ...

  7. 分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储

    http://blog.51cto.com/xpleaf/2093952 1 概述 在不用爬虫框架的情况,经过多方学习,尝试实现了一个分布式爬虫系统,并且可以将数据保存到不同地方,类似MySQL.HB ...

  8. SuperSocket学习笔记(一)-一个完整的例子

    一.什么是SuperSocket 以下是作者的介绍 执行以下命令,获取SuperSocket项目 $ git clone https://github.com/kerryjiang/SuperSock ...

  9. c++利用jsoncpp libcurl 构造http 包(原)

    我们手游要接入uc九游进行测试,要用http向uc那边的sdk 服务器post  json数据. 虽然他们提供了php,java还有c#的服务端demo,但是我们服务器是C++写的,我实在不想中间再转 ...

  10. get、post、put、delete、head请求方式

    对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不一定要用PUT和DELETE. 一:Jersey框架,实现了restful风格,常用的注解@GET.@POST.@PUT.@DELET ...