re模块

re模块 , 即正则表达式 , 本身是一种小型的、高度专业化的编程语言,它并不是Python的一部分

re模块的作用就是: 从大的字符串中挑选出 具有某种形状特点的字符串

常用元字符

^ : 以..开头

  1. s = 'abcdabc'
  2. res = re.findall('^ab', s)
  3. print(res)
  4. # ['ab']

$ : 以..结尾

  1. s = 'abcdabc'
  2. res = re.findall('bc$', s)
  3. print(res)
  4. # ['bc']

. : 任意字符

  1. s = 'abc红abc'
  2. res = re.findall('abc.', s)
  3. print(res)
  4. # ['abc红']

\d : 数字

  1. s = 'skld2342ljk'
  2. res = re.findall('\d', s)
  3. print(res)
  4. # ['2', '3', '4', '2']

\D : 非数字

  1. s = 'skld2342ljk'
  2. res = re.findall('\D', s)
  3. print(res)
  4. # ['s', 'k', 'l', 'd', 'l', 'j', 'k']

\w : 非空字符,即数字字母下划线

  1. s = 'skld_2你3 42ljk'
  2. res = re.findall('\w', s)
  3. print(res)
  4. # ['s', 'k', 'l', 'd', '_', '2', '你', '3', '4', '2', 'l', 'j', 'k']

**\W : 空字符,包括空格 换行 **

  1. s = 'skld_23 42ljk'
  2. res = re.findall('\W', s)
  3. print(res)
  4. # [' ']

\s : 空字符,包括空格 换行

  1. s = 'skld_23 42ljk'
  2. res = re.findall('\s', s)
  3. print(res)
  4. # [' ']

\S : 非空字符,即数字字母下划线

  1. s = 'skld_23 42ljk'
  2. res = re.findall('\S', s)
  3. print(res)
  4. # ['s', 'k', 'l', 'd', '_', '2', '3', '4', '2', 'l', 'j', 'k']

+ : 前面的一个字符至少1个 [1,正无穷)

  1. s = 'abcddabdabcdd abcd abc'
  2. print(re.findall('abcd+', s))
  3. # ['abcdd', 'abcdd', 'abcd']

?:前面的一个字符0-1个 前一个字符[0,1] 最大只有一个

  1. s = 'abcddddd abcd abc ab'
  2. print(re.findall('abcd?', s))
  3. # ['abcd', 'abcd', 'abc']

*** :前面的一个字符至少0个 前一个字符[0,正无穷)**

  1. s = 'abcddddd abcd abc ab'
  2. print(re.findall('abcd*', s))
  3. # ['abcddddd', 'abcd', 'abc']

[] : 中括号内的都可以 , 但是只占一个位置

  1. s = 'abc bbc cbc dbc abcd '
  2. print(re.findall('[abc]bc', s))
  3. # ['abc', 'bbc', 'cbc', 'abc']

[^] : 中括号的都不可以

  1. s = 'abc bbc cbc dbc'
  2. print(re.findall('[^abc]bc', s))
  3. # ['dbc']

|:或 满足就打印 , 一个或者两个三个

  1. s = 'abc bbd dbc'
  2. print(re.findall('abc|bbc', s))
  3. # ['abc']

{2}:前面的字符重复2个

  1. s = 'abccabc abccc'
  2. print(re.findall('abc{2}', s))
  3. # ['abcc', 'abcc']

{1,2}:前面的字符重复1-2个 区间是[1,2]

  1. s = 'abccabc abccc'
  2. print(re.findall('abc{1,2}', s))
  3. # ['abcc', 'abc', 'abcc']

特殊构造

a(?=\d) :a后面是数字,但是不要数字,不消耗字符串内容

  1. s = 'a123 aaaa a234 abc'
  2. # a1 aa
  3. # aa
  4. # aa
  5. # a2 ab
  6. print(re.findall('a(?=\d)', s))
  7. # ['a', 'a']
  8. print(re.findall('a(?=\w)', s))
  9. # ['a', 'a', 'a', 'a', 'a', 'a']

贪婪模式

Python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符 , 一定要找到最后 才停止

.(任意字符)*(0-无穷个)

  1. s = 'abcdefgbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbg'
  2. print(re.findall('a.*g', s))
  3. # ['abcdefgbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbg']

非贪婪模式

非贪婪的则相反,总是尝试匹配尽可能少的字符 , 找到一个就停止并返回

.(任意字符)*(0-无穷个)?(让他进入非贪婪模式)

  1. s = 'abcdefgbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbg'
  2. print(re.findall('a.*?g', s))
  3. # ['abcdefg']

re的常用函数

findall:最常用 推荐使用 直接在函数内部书写匹配规则

  1. import re
  2. a = re.findall("匹配规则", "这个字符串是否有匹配规则的字符")
  3. print(a)

compile:写一个特定的规则模板

  1. # 定义邮箱、手机号匹配规则,直接调用
  2. email_pattern = re.compile('\w+@\w+.com')
  3. phone_patter = re.compile('\d{13}')
  4. print(re.findall(email_pattern, s))

match: 从字符串开头找一个,找得到就不找了 ;找不到报错

  1. s = 'ab abcddd abc'
  2. res = re.match('abcd*', s)
  3. print(res.group())

search: 搜索,从整个内容中匹配,只找一个,找不到报错

  1. s = 'ab abcddd abc'
  2. res = re.search('abcd*', s)
  3. print(res.group())

split 切割,相当于字符串的split

  1. s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
  2. print(re.split('\d+', s))
  3. # ['ab', 'abcddd', 'abcasdfjlasjdk', 'l', 'lk', 'j', 'kl', 'kl', 'k', 'j', 'kl', 'j', 'lkj']

sub 替换,相当于字符串的replace

  1. s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
  2. print(re.sub('\d+', ' ', s))
  3. # ab abcddd abcasdfjlasjdk l lk j kl kl k j kl j lkj

subn 替换,会返回替换的次数

  1. s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
  2. print(re.subn('\d+', ' ', s))
  3. # ('ab abcddd abcasdfjlasjdk l lk j kl kl k j kl j lkj', 12)

re模块补充

re.S 会让.匹配换行符

  1. a = '''asdfhellopass:
  2. worldaf
  3. '''
  4. b = re.findall('hello(.*?)world', a)
  5. c = re.findall('hello(.*?)world', a, re.S)
  6. print(b)
  7. # []
  8. print(c)
  9. # ['pass:\n ']

. 不匹配换行

  1. s = '''abc
  2. abcabc*abc
  3. '''
  4. print(re.findall('abc.abc', s))
  5. # ['abc*abc']
  6. print(re.findall('abc.abc', s, re.S))
  7. # ['abc\nabc', 'abc*abc']

分组 --> 只要括号里的(...)

  1. s = 'abc abcd abcdd'
  2. print(re.findall('a(.)c(d)', s))
  3. # [('b', 'd'), ('b', 'd')]

有名分组

  1. s = 'abc abcd abcdd'
  2. print(re.search('a(?P<name>.)c(?P<name2>d)', s).groupdict())
  3. # {'name': 'b', 'name2': 'd'}

关于re模块必须知道的知识点

  1. .*? :

非贪婪匹配

  1. 贪婪和非贪婪:

    贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配

    非贪婪匹配(?):在满足匹配时,找到一个就停止,返回结果

  2. findall:

    findall(pattern, string, flags=0) 浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中,未匹配成功返回空列表

  3. re.S:

    表示 “.” 的作用扩展到整个字符串,包括“\n”。

  4. match和sarch的区别:

    match()函数只在string的开始位置匹配,找不到就报错

    search()会扫描整个string查找匹配,会扫描整个字符串并返回第一个成功的匹配结果

  5. 分组:

    ()表示分组,可以与 | 合用,(ab|cd)表示匹配字符 ab 或 字符 cd

  6. 有名分组:

    ?P<name> # ?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容(只对正则函数返回对象时有用)

re模块的基本使用的更多相关文章

  1. npm 私有模块的管理使用

    你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便. 开始前的工作 你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 np ...

  2. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  3. ES6模块import细节

    写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ...

  4. Python标准模块--ContextManager

    1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...

  5. Python标准模块--Unicode

    1 模块简介 Python 3中最大的变化之一就是删除了Unicode类型.在Python 2中,有str类型和unicode类型,例如, Python 2.7.6 (default, Oct 26 ...

  6. Python标准模块--Iterators和Generators

    1 模块简介 当你开始使用Python编程时,你或许已经使用了iterators(迭代器)和generators(生成器),你当时可能并没有意识到.在本篇博文中,我们将会学习迭代器和生成器是什么.当然 ...

  7. 自己实现一个javascript事件模块

    nodejs中的事件模块 nodejs中有一个events模块,用来给别的函数对象提供绑定事件.触发事件的能力.这个别的函数的对象,我把它叫做事件宿主对象(非权威叫法),其原理是把宿主函数的原型链指向 ...

  8. 理解nodejs模块的scope

    描述 原文档地址:https://docs.npmjs.com/misc/scope 所有npm模块都有name,有的模块的name还有scope.scope的命名规则和name差不多,同样不能有ur ...

  9. nodejs模块发布及命令行程序开发

    前置技能 npm工具为nodejs提供了一个模块和管理程序模块依赖的机制,当我们希望把模块贡献出去给他人使用时,可以把我们的程序发布到npm提供的公共仓库中,为了方便模块的管理,npm规定要使用一个叫 ...

  10. 开始学nodejs——net模块

    net模块的组成部分 详见 http://nodejs.cn/api/net.html 下面整理出了整个net模块的知识结构,和各个事件.方法.属性的用法 net.Server类 net.Socket ...

随机推荐

  1. markdown下载、安装、破解、汉化与常用语法

    markdown是一种纯文本格式的标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式. 一.markdown下载 markdown破解版下载地址: http://www.pc6.com/ ...

  2. navicat for mysql ;连接数据库报错1251,解决办法。

    转载 改密码方式:用管理员身份打开cmd mysql -uroot -p(输入密码)            进入mysql执行下面三个命令 use mysql: ALTER USER 'root'@' ...

  3. 当前机器的各种进程、服务信息的收集(win)

    当前机器的各种进程.服务信息的收集(win) 前言 我们在做渗透测试的过程中,遇到Windows系统的环境是最多的,然而在拿到一台Windows胸膛呢权限之后,我们要进行横向渗透测试或者纵向渗透测试, ...

  4. prototype与 _proto__的关系

    prototype与 __ proto__ 都是在这个过程中催生的产物,我们一会儿马上讨论,在这之...做对象即可,那javascript种究竟是通过什么来明确继承关系的呢. 一.构造函数: 构造函数 ...

  5. CDN实现原理

    避让:尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更稳定. 检测:通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时监 ...

  6. i春秋DMZ大型靶场实验(二)提权漏洞

    拿到靶场 直接进行扫描 爆破路径 发现 phpinfo, phpmyadmin  更具phpinfo 获取跟路径  也可以通过 输入错路径爆出绝对路径 phpmyamin  弱口令登录  root,r ...

  7. 详解Java8 Optional类{最全}

    1:Optional 1.1 概述 Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException),提供了一些的方法代替过去的if-else处理逻辑,并与Stre ...

  8. CheckBox状态多选

    前: <StackPanel Margin="> <Label FontWeight="Bold">Application Options< ...

  9. jedis 连接 虚拟机内redis服务

    最近一直在玩关于redis集群,这个关于集群的具体设置步骤可以看这个做为参考, 我在虚拟机内建立的是一个1主3从2哨兵的模式 然后在windows环境下是配置了jedis(具体步骤可以参考这个人写的) ...

  10. 实战--dango自带的分页(极简)

    注意,我将templates定义在项目的同级目录下: 在settings.py中配置 TEMPLATES = [ { 'BACKEND': 'django.template.backends.djan ...