正则表达式

正则表达式就是用来查找字符串的,它能够查找规则比较复杂的字符串。
使用正则表达式首先要导入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. Mac下安装Angular报错处理

    安装 Angular CLI 命令: sudo npm install -g @angular/cli 打印如下错误:(权限问题) gyp WARN EACCES user "root&qu ...

  2. Quartus 11进行编译Compile Design的时候出现错误near text ã

    1. 设计的工程在Compile Design的时候出现以下的错误,百思不得姐 Error (): Verilog HDL syntax error at div_5.v() near text ã ...

  3. MySQL数据库基础总结

    来源: 实验楼 链接: https://www.shiyanlou.com/courses/9 一.开发准备 # 打开 MySQL 服务 sudo service mysql start #使用 ro ...

  4. 《Cracking the Coding Interview》——第3章:栈和队列——题目5

    2014-03-18 05:33 题目:用两个栈来实现一个队列. 解法:栈是反的,队列是正的,反了再反就正过来了.所以,请看代码.操作中时间复杂度有O(1)的,有O(n)的,但均摊下来时间符合O(1) ...

  5. python /usr/bin/python^M: bad interpreter: No such file

    今天在WingIDE下写了个脚本,传到服务器执行后提示: -bash: /usr/bin/autocrorder: /usr/bin/python^M: bad interpreter: No suc ...

  6. 动态删边SPFA: [HNOI2014]道路堵塞

    [HNOI2014]道路堵塞 题目描述 $A$ 国有 $N$座城市,依次标为$1$到$N$.同时,在这$N$座城市间有$M$条单向道路,每条道路的长度是一个正整数.现在,$A$国交通部指定了一条从城市 ...

  7. 【bzoj2506】calc 根号分治+STL-vector+二分+莫队算法

    题目描述 给一个长度为n的非负整数序列A1,A2,…,An.现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且Ai mod p = k的值i的个数. 输入 第一行两个正整数n ...

  8. BZOJ2743 [HEOI2012]采花 【离线 + 树状数组】

    题目 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采 ...

  9. 性能优化-FSL(Force Synchronous Layout)强制同步布局

    通过chrome的Perfermance工具记录程序性能,切换到帧模式,点开其中一帧,看详情,中间为紫色的区块代表Layout,右上角带有红色三角的为警告,是chrome告知的强制同步布局,即FSL. ...

  10. 《c程序设计语言》读书笔记-3.5-按要求进制位数字转字符串

    #include <io.h> #include <stdio.h> #include <string.h> #include <stdlib.h> # ...