正则表达式

定义:

正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

是一种独立的规则,独立的语言。只和字符串打交道。

能做什么?

例子1:把一个文件中所有的手机号码都找出来;

# open打开文件

# 读文件str

# 从一长串的字符串中找到所有的11位数字

# 一个字符一个字符的读

例子2:爬虫,从网页的字符串中获取你想要的数据

例子3:提取特定日志内容

规则

字符组:

[] 写在中括号中的内容,都出现在下面的某一个字符的位置上都是符合规则的

[0-9]  匹配数字

[a-z]  匹配小写字母

[A-Z]  匹配大写字母

[4-9]  匹配4到9数字

[a-zA-Z] 匹配大小写字母

[a-zA-Z0-9] 匹配大小写字母+数字

[a-zA-Z0-9_] 匹配数字字母下滑线

转义符+元字符

\w  匹配数字字母下滑线word关键字[a-zA-Z0-9_]

\d  匹配所有的数字digit     [0-9]

\s  匹配所有的空白符 回车/换行符 制表符 空格space  [\n\t ]

\W \D \S 和\w \d \s取反

\b 表示单词的边界

[\s\S] [\d\D] [\w\W] 三组全集 意思是匹配所有字符

和转义字母相关的 元字符

\w \d \s(\n\t) \b \W \D \S

元字符

^ 匹配一个字符串的开始

$ 匹配一个字符串的结束

. 表示匹配除换行符之外的所有字符

[]  只要出现在中括号内的内容都可以被匹配

[^] 只要不出现在中括号中的内容都可以被匹配

a|b  或  符合a规则的或者b规则的都可以被匹配

# 如果a规则是b规则的一部分,且a规则比b规则要苛刻/长,就把a规则写在前面

# 将更复杂的\更长的规则写在最前面

() 分组  表示给几个字符加上量词约束的需求的时候,就给这些量词分在一个组

量词

{n}表示 这个量词之前的字符出现n次

{n,} 表示这个量词之前的字符至少出现n次

{n,m} 表示这个量词之前的字符出现n-m次

? 表示匹配量词之前的字符出现0次 或者1次 表示可有可无

+ 表示匹配量词之前的字符出现1次 或者 多次

* 表示匹配量词之前的字符出现0次 或者 多次

练习:

匹配整数  \d+

匹配小数 \d+\.\d+

匹配小数或者整数  \d+\.\d+|\d+   \d+(\.\d+)?

匹配身份证号(暂不考虑校验规则):

[1-9]\d{14}(\d{2}[\dX])?

[1-9]\d{16}[\dX]|[1-9]\d{14}

贪婪匹配

在允许的范围内取最长的结果

非贪婪模式/惰性匹配:在量词的后面加上?

.*?x   匹配任意非换行符字符任意长度 直到遇到x就停止

字符+量词    约束一个字符连续出现的次数

字符+量词+?约束一个字符连续出现的最少次数

字符+量词+?+x约束一个字符连续出现量词范围内的最少次数,遇到x就立即停止

以上都是正则表达式自身的规则,与python没有毛关系

Re模块

findall : 匹配所有 每一项都是列表中的一个元素

search : 只匹配从左到右的第一个,得到的不是直接的结果,而是一个变量,通过这个变量的group方法来获取结果

如果没有匹配到,会返回None,使用group会报错

程序中一般都是这样使用:

match:从头开始匹配,相当于search中的正则表达式加上一个^

字符串处理的扩展 : 替换 切割

split

sub  旧的 新的 替换次数

subn 返回一个元组,第二个元素是替换的次数

compile 模块 节省时间

直接把正则表达式编译成字节码,在多次使用的过程中,不会多次编译

finditer 节省使用正则表达式解决问题的空间/内存

分组

group()表示总体匹配出的内容,group(num)表示匹配出第num个分组

importre

s = "happy every day"res = re.search('()([\w\W]+)(\w+>)',s)

print(res.group())  # 所有结果print(res.group(1))  # 数字代表第几个分组print(res.group(2))

print(res.group(3))

输出

Findall 优先级

ret = re.findall('www.(baidu|sina).com', 'www.sina.com')

print(ret)  # ['sina']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可ret = re.findall('www.(?:baidu|sina).com', 'www.sina.com')

print(ret)  # ['www.sina.com']

flags有很多可选值:

re.I(IGNORECASE)忽略大小写,括号内是完整的写法

re.M(MULTILINE)多行模式,改变^和$的行为

re.S(DOTALL)点可以匹配任意字符,包括换行符

re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境,不推荐使用

re.U(UNICODE) 使用\w \W \s \S \d \D使用取决于unicode定义的字符属性。在python3中默认使用该flag

re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释

python3 常用模块_python3-常用模块之re相关推荐

  1. python3常用模块_Python3 常用模块1

    os模块 通过os模块我们可以与操作系统交互, 控制文件和文件夹 对文件夹操作 # 判断是否为文件夹 os.path.isdir() # 创建文件夹 os.mkdir() # 删除文件夹 os.rmd ...

  2. python hashlib模块_python3 hashlib模块

    Python3 hashlib模块和hmac 模块(加密) hashlib 是一个提供了一些流行的hash算法的 Python 标准库.其中所包括的算法有 md5, sha1, sha224, sha ...

  3. python shelve模块_python3 shelve模块的详解

    python3 shelve模块的详解 一.简介 在python3中我们使用json或者pickle持久化数据,能dump多次,但只能load一次,因为先前的数据已经被后面dump的数据覆盖掉了.如果 ...

  4. python shelve模块_python3 shelve模块的实例用法讲解

    python3 shelve模块的详解 python3 shelve模块的详解 一.简介 在python3中我们使用json或者pickle持久化数据,能dump多次,但只能load一次,因为先前的数 ...

  5. python3常用模块_Python3 常用模块

    一.time与datetime模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们 ...

  6. python3 安装模块_python3 Crypto模块的安装与使用

    前言 安装Cryto模块用pip3 install pycrypto老是会报错.搞了半天,最终决定在linux下面去做. 以下流程限于linux系统: Crypto不是自带的模块,需要下载. 我下载了 ...

  7. python3 os模块_python3 os模块

    os模块就是对操作系统进行操作, 这个模块提供了一种使用操作系统相关功能的可移植方式. 1.系统信息 posix.uname_result(sysname='Linux', nodename='lia ...

  8. python3 time模块_python3 time模块

    importtime#strftime获取当前系统格式化时间,%X和%H:%M:%S相等 print(time.strftime("%Y-%m-%d %H:%M:%S"))prin ...

  9. python常用正则表达式_Python3常用正则表达式

    正则表达式速查表 字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个向后引用.或一个八进制转义符.例如,"n"匹配字符"n"."\ ...

  10. python常用操作符_Python--3常用操作符

    算数操作符+ - * / % ** // >>>a = 5   > >>a += 3 >>>b = 3 >>>b -= 1 &g ...

最新文章

  1. 解决com.mysql.jdbc.PacketTooBigException: Packet for query is too large (3158064)问题
  2. Oracle apex 搭建
  3. 第二阶段---python基础
  4. Python正则表达式之扩展语法(5)
  5. 分享-WinForm界面开发之布局控件WeifenLuo.WinFormsUI.Docking的使用
  6. 用这开源小书学 Docker,香!
  7. 1-7:学习shell之透过shell看世界
  8. Php学习准备(环境)
  9. 你最大的敌人是自己:一个独立游戏人的创业自白
  10. 记一次easywechat企业付款问题
  11. unity3dk帧_Unity3D制作序列帧动画的方法
  12. 电子与智能化工程专业承包资质标准
  13. WPF 点击按钮打开新窗口
  14. 判断星期的方法(已知1900年1月1日是星期一)
  15. 块存储、文件存储、对象存储
  16. 关于SQL的char,varchar字段在导出时切断中文字符显示问号或乱码的问题[原创]
  17. Java如何进行文件上传与下载
  18. cocos creator制作游戏实战-Flak Cannon(二)
  19. linux nohup 命令用法详解
  20. MMX, SSE(XMM,MXCSR,FXSAVE),SSE2,SSE3,AVX,AVX-512

热门文章

  1. 【CTF题】使用文件包含漏洞读取网页代码
  2. python cv2截取不规则区域图片
  3. 20155314 2016-2017-2 《Java程序设计》第4周学习总结
  4. 张文宏教授再发“霸气”言论!面对疫情,一个真正的大国是什么样子?
  5. 把代码做成笔记——Jupyter Notebook
  6. SpringBoot 集成 ES 7.6.2 并对字段进行中文和拼音分词处理
  7. 浅谈人工智能发展现状及未来挑战
  8. kbhit linux windows通用,_kbhit() for Linux
  9. html5 red5,一个基于red5+flash的网络聊天室red5Chat
  10. Sticky 黏性定位 兼容性css3