正则表达式

正则表达式就是用来查找字符串的,它能够查找规则比较复杂的字符串。
使用正则表达式首先要导入re模块
import re s = "besttest is good!besttest best"
print(re.match(r'best',s))
# 返回对象为 <_sre.SRE_Match object; span=(0, 8), match='besttest'>
# match方法接收3个参数,第一个是匹配的规则(待匹配的样本字符串),也就是正则表达式;
# 第二个是被检查的字符串;
# 第三个参数不是必填的,用于控制正则表达式的匹配方式,看下面正则表达式的匹配模式。
# match方法是从字符串的“第一个单词”中匹配字符串,如果匹配到返回一个对象,如果匹配不到,则返回None print(re.search(r'is',s))
# 返回对象为 <_sre.SRE_Match object; span=(9, 11), match='is'>
# search方法的参数和match一样,不一样的是,match是从字符串开头第一个词匹配,只看开头,
# 而search方法则是从字符串的整个内容里面找,如果找到了就返回第一个,找不到就返回None。
# 如过想列出找到的内容需要用.group()方法 print(re.search(r'is',s).group()),这样结果就是is # 注意到了吗?在正则表达式的前面我加了一个‘r’,它代表按字符原样来匹配,否则当表达式字符串中包含转义自如的话就会被转义 print(re.findall(r'best',s))
# findall方法的参数和 match、search 一样,不一样的是,findall 是从字符串所有内容里找,找到就返回,直到找完。
# findall 方法返回的是一个列表,而且直接返回,直接print就可以看到,不用group()方法。 print(re.sub(r'best','BEST',s))
# sub 方法和字符串的replace方法一样,是用来替换字符串的;
# 用正则表达式身后的字符串替换正则表达式的字符串;
# 会返回一个新的整个字符串,如果匹配不到的话,返回原来的字符串。 数量词
要与findall方法联合使用 星号 *
# 匹配星号*前面的一个字符0次或多次,仅仅是*号前的一个字符。
print(re.findall(r'a*b','ab a abbbbbb b'))
结果是 ['ab', 'ab', 'b', 'b', 'b', 'b', 'b', 'b'] 加号 +
# 匹配加号+前面的一个字符1次或多次,仅仅是+号前面的一个字符。
print(re.findall(r'st+','besttest is best s'))
结果是 ['stt', 'st', 'st'] 问号 ?
# 匹配问号?前面的一个字符0次或1次,仅仅是?号前面的一个字符。
print(re.findall(r'st?','besttest is best'))
结果是 ['st', 'st', 's', 'st'] 指定匹配次数 {n}
# 匹配花括号前面的一个字符n次,仅仅是花括号前面的一个字符。
print(re.findall(r't{3}er', 'besttest is best lettter letter'))
结果是 ['ttter'] 指定匹配次数的范围 {m,n}
# 匹配花括号前面的一个字符m到n次,仅仅是花括号前面的一个字符。
print(re.findall(r't{1,3}er', 'besterst is best lettter letter'))
结果是 ['ter', 'ttter', 'tter'] 一般字符 '.' # 默认匹配除\n之外的任意一个字符
print(re.findall(r'b.','besttest is good ba bf bo'))
结果: ['be', 'ba', 'bf', 'bo'] '\' # 转译符,前面的* + ?这样的字符都有特殊含义了,如果你就是想找它的话,那就得转译了
# 意思就是说如果你想让特殊字符失去以前的含义,那么就得给它前面加上'\'
print(re.findall(r'\?','besttest is best????'))
结果: ['?', '?', '?', '?'] '|' # 匹配|左或|右的字符
print(re.findall(r'best|is','besttest is best'))
结果: ['best', 'is', 'best'] '[]' # 字符集合,里面是某些字符的集合,匹配的时候是这个集合里面的任意一个就可以
print(re.findall(r'be[stacj]','besttest is best bejson bed'))
结果: ['bes', 'bes', 'bej']
# 在[]里面如果用^的话代表取反,也就是不包括的这些字符串的
print(re.findall(r'be[^stac]','besttest is best bejson'))
结果: ['bed'] 边界匹配 '^' # 数字6的上键位,它代表匹配以什么字符串开头,多行情况下匹配每一行的开头。
print(re.findall(r'^b','besttest is good\nbestest',re.M))
print(re.findall(r'^http://','http://www.baidu.com is good\nbestest'))
结果: ['b', 'b'] 和 ['http://'] '$' # 匹配以什么字符结尾,多行情况下匹配每一行的结尾;
# 多行时是从最后一行开始匹配。
print(re.findall(r'd$','besttest is good'))
print(re.findall(r'\.jpeg$|\.gif$|\.png$','touxiang.png\nabc.gif',re.M))
结果: ['d'] 和 ['.png', '.gif'] '\A' # 仅以什么字符开头,和^不同的是它不能用多行模式。
print(re.findall(r'\Ahttp://','http://www.baidu.com is good\nhttp://www.sohu.com',re.M))
print(re.findall(r'\Ab','besttest is good'))
结果:['http://'] 和 ['b'] '\Z' # 仅以什么字符结尾,和$不同的是它不能用多行模式;
# 在多行时,是从最后一行开始匹配。
print(re.findall(r'\.jpeg\Z|\.png\Z|\.gif\Z','touxiang.png\nqq.gif\nabc.jpeg',re.M))
结果: ['.jpeg'] 预定义字符集合 '\d' # 匹配数字0-9
print(re.findall(r'\d+','sdf2342312sdfs342332sdf'))
结果: ['2342312', '342332']
print(re.findall(r'\d','sdf2342312sdfs342332sdf'))
结果: ['2', '3', '4', '2', '3', '1', '2', '3', '4', '2', '3', '3', '2'] '\D' # 匹配非数字
print(re.findall(r'\D+','sdf2342312sdfs……&()'))
结果: ['sdf', 'sdfs……&()']
print(re.findall(r'\D','sdf2342312sdfs……&()'))
结果: ['s', 'd', 'f', 's', 'd', 'f', 's', '…', '…', '&', '(', ')'] '\w' # 匹配[A-Za-z0-9],也就是所有的字母和数字和中文
print(re.findall(r'\w+','sdf234%^2312sdfs&你好你好'))
结果: ['sdf234', '2312sdfs', '你好你好'] '\W' # 匹配不是[A-Za-z0-9],也就是不是字母、数字和中文字符的字符串
print(re.findall(r'\W+','sdf234%^2312sdfs&你好你好!。。'))
结果: ['%^', '&', '!。。'] '\s' # 匹配空白字符如 \t、\n、\r,空格
print(re.findall('\s','axss\n\tsdf\t\r\t sdfsd sdf '))
结果: ['\n', '\t', '\t', '\r', '\t', ' ', ' ', ' '] '\S' # 匹配非空白字符,不是\t、\n、\r,空格
print(re.findall('\S+','axss\n\tsdf\t\r\t sdfsd sdf '))
结果: ['axss', 'sdf', 'sdfsd', 'sdf'] [A-z]大小写字母
[a-z]#小写字母
[A-Z]#大写字母
[0-9]#所有的数字 print('new_str:',new_str)
print(re.findall(r'[A-Z]',new_str))
print(re.findall(r'[a-z]',new_str))
print(re.findall(r'[0-9]',new_str)) 插播程序栗子:

需求: 生成制定个数的 8位字符串,每个字符串必须包含大写字母、小写字母和数字,
把这些字符串保存在名为password的文件里。 import re,string,random sub_str = string.ascii_letters + string.digits
fw = open('passwd','w')
def passwds(n):
count = 0
while count<n:
new_str = ''.join(random.sample(sub_str, 8))
if re.search(r'[A-Z]', new_str) and \
re.search(r'[a-z]', new_str) and \
re.search(r'[0-9]', new_str):
fw.write(new_str+'\n')
count+=1
passwds(5) 分组匹配 '(...)' # 分组匹配,把某些规则写成在一个括号括起来的组里,这样就可以直接对这个组进行一些匹配了。
# 举个例子,如果要匹配ip地址的话,
# ip地址是类似这样的 192.168.5.1 每一段都是1位到3位的数字,数字后面有个隔点,
# 正常写的话,要这样写正则匹配:
# print(re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',"192.168.1.3"))
# >>> ['192.168.1.3']
# 这样写有点麻烦了,从ip地址我们可以发现规律,除了第一段,之后的每段都是'.\d{1,3}',1到3个数字,
# 写重复的代码是低级的,这样的话就可以用分组来简化上面写的正则匹配,
# 把'.\d{1,3}'当做一个整体,然后让它出现3次就ok了,可以改成如下的样纸:
# print(re.search(r'\d{1,3}(\.\d{1,3}){3}',"192.168.1.3").group())
# 这里用了search方法,结果和上面的一样:
# >>> 192.168.1.3
# 如果用findall方法:
# print(re.findall(r'\d{1,3}(\.\d{1,3}){3}',"192.168.1.3"))
# 发现结果是下面这样的,不是我们想要的,
# >>> ['.3']
# 为啥会这样呢,用match方法和search方法都是正常的,findall方法这里有个坑:
# 就是如果findall方法里面有分组的话,默认结果就只是分组里面的内容,也就是匹配到小括号里面的内容,
# 如果想让结果正确的话就在分组最前面写上'?:',一个问号和一个冒号就可以了,启用“不捕捉模式”
# print(re.findall(r'\d{1,3}(?:\.\d{1,3}){3}',"192.168.1.3"))
# >>> 192.168.1.3 # findall方法里面有分组的话,默认结果就只是分组里面的内容
# findall方法里面有分组的话,默认结果就只是分组里面的内容
# findall方法里面有分组的话,默认结果就只是分组里面的内容

Python学习杂记_15_正则表达式的更多相关文章

  1. Python学习杂记_4_分支和循环

    分支 和 循环 分支和循环这俩结构在各语言中都有着很重要的地位,当然我之前都没有学好,这里总结一下在Python学习中对这俩结构的认识. 分支结构 # 单分支 if 条件判断: 执行语句… # 双分支 ...

  2. Python学习笔记013_正则表达式

    Python中的正则表达式是通过 re 模块实现的. 通配符 .  表示除了换行以外的任何字符; 编写正则表达式时使用  r're'  , r + 正则表达式内容 >>> impor ...

  3. python学习笔记之——正则表达式

    1.re模块 Python通过re模块提供对正则表达式的支持,re 模块使 Python 语言拥有全部的正则表达式功能.使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用 ...

  4. 从零开始的Python学习Episode 15——正则表达式

    正则表达式 正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现,所以使用时要导入re模块.正则表达式模式被编译成一系列的字节码 ...

  5. python学习(十四)正则表达式

    原文链接 ## 什么是正则表达式`正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑 ...

  6. Python学习手册之正则表达式示例--邮箱地址提取

    在上一篇文章中,我们介绍了 Python 的捕获组和特殊匹配字符串,现在我们介绍 Python 的正则表达式使用示例.查看上一篇文章请点击:https://www.cnblogs.com/dustma ...

  7. Python学习手册之正则表达式和元字符

    在上一篇文章中,我们介绍了 Python 的数据封装.类方法.静态方法和属性函数,现在我们介绍 Python 的正则表达式和元字符.查看上一篇文章请点击:https://www.cnblogs.com ...

  8. Python学习杂记

    Python中关键字yield有什么作用? 首先得理解generators,而理解generators前还要理解iterables: 你可以用在for...in...语句中的都是可迭代的:比如list ...

  9. Python学习笔记 - day10 - 正则表达式

    正则表达式 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样 ...

随机推荐

  1. 5-1 练习css 总结

    1. 边框 border:3px dotted; border: 2px solid yellow; 背景颜色 background-color: red; 外攘 margin:20px 0 20px ...

  2. 亲手搭建一个基于Asp.Net WebApi的项目基础框架1

    目标:教大家搭建一个简易的前后端分离的项目框架. 目录: 1:关于项目架构的概念 2:前后端分离的开发模式 3:搭建框架的各个部分 这段时间比较闲,所以想把之前项目里用到的一些技术写到博客里来,分享给 ...

  3. 部署 CA 和 NPS 服务器证书

    TechNet 库 Windows Server Windows Server 2008 R2 und Windows Server 2008 按类别提供的 Windows Server 内容 按类别 ...

  4. python之urllib.request.urlopen(url)报错urllib.error.HTTPError: HTTP Error 403: Forbidden处理及引申浏览器User Agent处理

    最近在跟着院内大神学习python的过程中,发现使用urllib.request.urlopen(url)请求服务器是报错: 在园子里找原因,发现原因为: 只会收到一个单纯的对于该页面访问的请求,但是 ...

  5. rabbitmq之rpc

    环境:windows或者Linux,python3.6,rabbitmq3.5要求: 可以对指定机器异步的执行多个命令 例子: >>:run "df -h" --hos ...

  6. ironic-conductor与ipa交互clean部分代码分析

    clean的动作会在provide和delete阶段才会触发 从代码分析: 对节点执行的node provide/deleted/clean会先发送到ironicclient ironicclient ...

  7. [C++] 拓展属性

    inline函数 函数重载 占位参数和默认参数 /*__________________________________________________________________ 背景: C++ ...

  8. NodeJs01 文件浏览器

    ES6常用新语法 前言 是时候学点新的JS了! 为了在学习NodeJs之前,能及时用上语言的新特性,我们打算从一开始先学习一下JavaScript语言的最基本最常用新语法.本课程的内容,是已经假设你有 ...

  9. fragment中的WebView返回上一页

    public final class Text1Fm extends Fragment { static WebView mWeb; private View mContentView; privat ...

  10. java值转递?引用传递?

    值传递是传递的是原值的副本,引用传递传递的是原值. 在Java中,如果是基本数据类型,传递的是该参数字面量值的拷贝.如果是引用数据类型,传递的是该参数所引用对象在堆中地址的拷贝. swap(int a ...