1.模块re

  • 以一定规则,快速检索文本,或是实现一些替换操作
  • 默认下,区分大小写

2.常见的匹配字符表

字符 描述
\d 代表任意数字,就是阿拉伯数字 0-9 这些
\D 代表非数字的字符。与\d完全相反
\w 代表字母,数字,下划线。也就是 a-z、A-Z、0-9、_
\W 跟 \w 相反 ,代表不是字母,不是数字,不是下划线的字符。
\n 代表一个换行。
\r 代表一个回车。
\f 代表换页。
\t 代表一个 Tab 。
\s 代表所有的空白字符,也就是上面这四个:\n、\r、\t、\f。
\S 跟 \s 相反,代表所有不是空白的字符。
\A 代表字符串的开始。
\Z 代表字符串的结束。
^ 匹配字符串开始的位置。
$ 匹配字符创结束的位置。
. 代表所有的单个字符,除了 \n \r
[...] 代表在 [] 范围内的字符,比如 [a-z] 就代表 a到z的字母
[^...] 跟 [...] 唱反调,代表不在 [] 范围内的字符
匹配在 {n} 前面的东西,比如: o{2} 不能匹配 Bob 中的 o ,但是能匹配 food 中的两个o。
{n,m} 匹配在 {n,m} 前面的东西,比如:o{1,3} 将匹配fooooood中的前三个o。
{n,} 匹配在 {n,} 前面的东西,比如:o{2,} 不能匹配“Bob”中的“o”,但能匹配fooooood中的所有o。
* 和 {0,} 一个样,匹配 * 前面的 0 次或多次。 比如 zo* 能匹配“z”、“zo”以及“zoo”。
+ 和{1,} 一个样,匹配 + 前面 1 次或多次。 比如 zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。
和{0,1} 一个样,匹配 ?前面 0 次或 1 次。
a|b 匹配 a 或者 b。
() 匹配括号里面的内容。
a = 'C|C++|C#|Python|Java'
# 判断字符串 a 中是否含有 Python
print(a.index('Python')>-1) # True
print('Python' in a) # True import re re.findall('Python', a) # 在字符串 a 中,找到所有的'Python'字符串
print(re.findall("Python", a)) # ['Python']

2.1/d /D

import re
a = 'C0C++1C#2Python3Java'
# 检索所有数字
r = re.findall('\d', a) # \d 匹配所有数字 元字符的一种
print(r) # ['0', '1', '2', '3'] r = re.findall('\D', a) # \d 匹配所有非数字 元字符的一种
print(r) # ['0', '1', '2', '3']
# ['C', 'C', '+', '+', 'C', '#', 'P', 'y', 't', 'h', 'o', 'n', 'J', 'a', 'v', 'a']

2.2[] 表示或

#  []  表示或
import re
s = 'abc, acc, adc, aec, afc, ahc'
r = re.findall('a[cf]c', s) # 匹配中间是 c 或 f 的字符串
print(r) # ['acc', 'afc'] # [^] 表示否定
r = re.findall('a[^cf]c', s) # 匹配中间不是 c 和 f 的字符串
print(r) # ['abc', 'adc', 'aec', 'ahc'] # [c-f] 匹配c 到 f 的所有字符
r = re.findall('a[c-f]c', s) # 匹配 c 到 f 的字符
print(r) # ['acc', 'adc', 'aec', 'afc']

2.3\w \W

# 概括字符集
# \w \W
import re
a = 'C0C++\n1C# 2Python3*Java_' r = re.findall('\w', a) # 匹配数字和字母 相当于 [A-Za-z0-9_]
print(r)
# ['C', '0', 'C', '1', 'C', '2', 'P', 'y', 't', 'h', 'o', 'n', '3', 'J', 'a', 'v', 'a', '_'] r = re.findall('\W', a) # 非单词字符
print(r) # ['+', '+', '\n', '#', ' ', '*'] # \s 空白字符
r = re.findall('\s', a)
print(r) # ['\n', ' ']

2.4{} 表示匹配次数

# 数量词
# {4} 4 表示每次匹配次数
import re
a = 'python 11 java 22 php'
r = re.findall('[a-z]{3}', a)
print(r) # ['pyt', 'hon', 'jav', 'php'] # {3, 6} 表示匹配次数在 3到6 之间
r = re.findall('[a-z]{3,6}', a)
print(r) # ['python', 'java', 'php']

2.5贪婪 非贪婪

# 贪婪 非贪婪
# python 默认为贪婪模式 尽可能 多匹配 和 多次匹配
# 非贪婪模式 表达式后面加 ? 匹配最少的次数
r = re.findall('[a-z]{3,6}?', a)
print(r) # ['pyt', 'hon', 'jav', 'php']

2.6* +

# * 匹配 0 次或者无限多次
a = 'pytho0python1pythonn2'
r = re.findall('python*', a) # 与 * 紧挨的字符n 匹配0次或是无限多次
print(r) # ['pytho', 'python', 'pythonn'] r = re.findall('pytho*', a) # 与 * 紧挨的字符n 匹配0次或是无限多次
print(r) # ['pytho', 'pytho', 'pytho'] r = re.findall('pythonn*', a) # 与 * 紧挨的字符n 匹配0次或是无限多次
print(r) # ['python', 'pythonn'] # + 匹配一次或无限多次
import re
r = re.findall('python+', a) # 与 * 紧挨的字符n 匹配1次或是无限多次
print(r) # ['python', 'pythonn'] # 不加 ?
r = re.findall('python{1,2}', a) # 匹配n 出现一次到两次
print(r) # ['python', 'pythonn'] # 加了 ?
r = re.findall('python{1,2}?', a) # 匹配n 出现一次
print(r) # ['python', 'python']

2.7^ $ 边界符

# 边界匹配
import re
qq = '1000001' r = re.findall('\d{4,8}', qq) # 匹配4 到8 位的QQ号
print(r) # ['1000001'] qq = '10000000001'
r = re.findall('\d{4,8}', qq) # 匹配4 到8 位的QQ号
print(r) # ['1000001'] 没有达到目的 # ^ $ 边界符
# ^ 规定以什么开始
# $ 规定以什么结束
r = re.findall('^\d{4,8}$', qq) # 匹配4 到8 位的QQ号
print(r) # [] 没有匹配到 r = re.findall('^0000', qq) # 匹配从 0 开始的字符串
print(r) # [] 没有匹配到

2.8() 分组

# ()  一个括号对应一组
import re
a = 'pythonpythonpythonJs' r = re.findall('(python){3}(JS)', a)
print(r) # [] # re.I 不区分大小写 第三个参数
r = re.findall('(python)(JS)', a, re.I)
print(r) # [('python', 'Js')] # 接受多个第三个参数时,用|隔开
r = re.findall('(python)(JS)', a, re.I | re.S)
print(r) # [('python', 'Js')]

2.9. 匹配除换行符\n 以外的其他所有字符

# . 匹配出换行符\n 以外的其他所有字符
a = 'python\nCC'
r = re.findall('python.', a, re.I)
print(r) # [] 无法匹配\n r = re.findall('python.', a, re.S) # 让 . 可以匹配换行符
print(r) # ['python\n']

2.10re.sub 替换操作

# re.sub 替换操作
import re
language = 'PythonC#JavaC#PHPC#'
r = re.sub('C#', 'GO', language)
print(r) # PythonGOJavaGOPHPGO r = re.sub('C#', 'GO', language, 1)
print(r) # PythonGOJavaC#PHPC# 只替换了一个 r = re.sub('C#', 'GO', language, 0)
print(r) # PythonGOJavaGOPHPGO # re.sub 的第二个参数可以是函数
def convert(value):
pass
r = re.sub('C#', convert, language)
print(r) # PythonJavaPHP def conver(value):
matched = value.group()
return '!!' + matched + '!!' r = re.sub('C#', convert, language)
print(r) # Python!!C#!!PHP!!C#!!

2.11将函数作为参数

# 将函数作为参数
import re
s = 'ABC37978D432' def convert(value):
# 拿到具体数字
matched = value.group()
if matched >= 6:
return 9
else:
return 0 r = re.sub('\d', convert, s)
print(r) # ABC09999D000

2.12re.match re.search

# re.match
# re.search
# 都返回类对象
import re
s = 'ABC37978D432' r = re.match('\d', s) # 从字符串的开始位置开始匹配,若不符,则返回None
print(r) # None
r = re.search('\d', s) # 在字符串中寻找可以匹配的
print(r) # <re.Match object; span=(3, 4), match='3'>
print(r.group()) # 3
print(r.span()) # (3, 4) 返回匹配的区间

2.13group 分组

# group 分组
# group() 默认值为 0 返回正则的完整匹配结果
import re
s = 'life is short, i use python' r = re.search('life.*python', s)
print(r.group()) # life is short, i use python # () 进行分组
r = re.search('(life.*python)', s)
print(r.group(0)) # life is short, i use python # group(1)
r = re.search('life(.*)python', s)
print(r.group(1)) # is short, i use r = re.findall('life(.*)python', s)
print(r) # is short, i use s = 'life is short, i use python, i love python'
r = re.search('life(.*)python(.*)python', s)
print(r.group(0)) # life is short, i use python, i love python
print(r.group(1)) # is short, i use
print(r.group(2)) # , i love
print(r.group(0,1,2)) # ('life is short, i use python, i love python', ' is short, i use ', ', i love ')
print(r.groups()) # (' is short, i use ', ', i love ')

一些例子

正则表达式

import re

line = 'booooooooobbby123'
r = re.match(".*(b.*b).*", line)
print(r.group(1)) #贪婪模式下,检索到最后符合的内容
print(r.group(0)) r = re.match(".*?(b.*?b).*", line) #对 ? 后面的 检索进行非贪婪模式
print(r.group(1)) # +
print('~+~~~~~~~~~')
r = re.match(".*(b.+b)", line) #+ 前面内容至少出现一次
print(r.group(1)) print('|||||')
r = re.match(".*(bbb|bby123)", line) # | 或关系 存在一个即可
print(r.group(1)) print('|||||')
r = re.match(".*(bby123|bbb)", line) # | 或关系 存在一个即可
print(r.group(1)) line2 = '15541861937'
regex_str = "(1[2345][0-9]{3})"
r = re.match(regex_str, line2)
print(r.group(0)) #汉字
print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
line = '你好吗'
r = re.match("[\u4E00-\u9FA5]+", line)
print(r.group(0)) print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
line = '你 好吗'
r = re.match("[\u4E00-\u9FA5]+", line)
print(r.group(0)) print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
line = 'study in 北京大学'
r = re.match(".*([\u4E00-\u9FA5]+大学)", line)
print(r.group(1)) print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
line = 'study in 北京大学'
r = re.match(".*?([\u4E00-\u9FA5]+大学)", line)
print(r.group(1)) line = 'XXX出生于2001年6月'
line = 'XXX出生于2001/6/1'
line = 'XXX出生于2001-6-1'
line = 'XXX出生于2001-06-01'
line = 'XXX出生于2001-06' regex_str = ".*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|$))"

python笔记:第十一章正则表达式的更多相关文章

  1. Linux 笔记 - 第十一章 正则表达式

    博客地址:http://www.moonxy.com 一.前言 正则表达式(英语为 Regular Expression,在代码中常简写为 regex.regexp 或 RE),是使用单个字符串来描述 ...

  2. Python笔记·第十一章—— 函数 (二) 装饰器

    一 为何要用装饰器 有的时候写完一段代码,过段时间需要对它进行升级.添加一些新功能,但是如果要直接修改原来的代码会影响其他人的调用,所以就需要一个不修改源代码且不修改原函数的调用方式的东西又能为原函数 ...

  3. 《Linux内核设计与实现》第五周读书笔记——第十一章

    <Linux内核设计与实现>第五周读书笔记——第十一章 20135301张忻 估算学习时间:共2.5小时 读书:2.0 代码:0 作业:0 博客:0.5 实际学习时间:共3.0小时 读书: ...

  4. 《图解HTTP》阅读笔记--第十一章针对web的攻击技术

    第十一章.针对WEB的攻击技术 ----<图解HTTP>阅读笔记攻击目标---Web简单的HTTP协议本身并不存在安全性 问题,协议本身并不会成为被攻击的对象,应用HTTP的服务器和客户端 ...

  5. python 教程 第二十一章、 扩展Python

    第二十一章. 扩展Python /* D:\Python27\Lib\Extest-1.0\Extest2.c */ #include <stdio.h> #include <std ...

  6. [CSAPP笔记][第十一章网络编程]

    第十一章 网络编程 我们需要理解基本的客户端-服务端编程模型,以及如何编写使用因特网提供的服务的客户端-服务端程序. 最后,我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web服务器,能够为真 ...

  7. o'Reill的SVG精髓(第二版)学习笔记——第十一章

    第十一章:滤镜 11.1滤镜的工作原理 当SVG阅读器程序处理一个图形对象时,它会将对象呈现在位图输出设备上:在某一时刻,阅读器程序会把对象的描述信息转换为一组对应的像素,然后呈现在输出设备上.例如我 ...

  8. python 教程 第十一章、 异常

    第十一章. 异常 1)    try/except/else格式 try: s = raw_input('--> ') except EOFError: print 'Why did you d ...

  9. [Python笔记][第四章Python正则表达式]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之正则表达式 正则表达式是字符串处理的有力工具和技术,正则表达式使用预定义的特定模式去匹配一类具有共同特征的字符串,主要用于字符串处理 ...

  10. 《利用python进行数据分析》读书笔记--第十一章 金融和经济数据应用(一)

    自2005年开始,python在金融行业中的应用越来越多,这主要得益于越来越成熟的函数库(NumPy和pandas)以及大量经验丰富的程序员.许多机构发现python不仅非常适合成为交互式的分析环境, ...

随机推荐

  1. 【FAQ】关于华为推送服务因营销消息频次管控导致服务通讯类消息下发失败的解决方案

    一. 问题描述 使用华为推送服务下发IM消息时,下发消息请求成功且code码为80000000,但是手机总是收不到消息: 在华为推送自助分析(Beta)平台查看发现,消息发送触发了频控. 二. 问题原 ...

  2. 【LeetCode动态规划#14】子序列系列题(最长递增子序列、最长连续递增序列、最长重复子数组、最长公共子序列)

    最长递增子序列 力扣题目链接(opens new window) 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度. 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其 ...

  3. .Net开发的音频分离桌面应用,可用于提取背景音乐

    背景音乐对于视频来说是非常重要的,制作视频的人来说,听到一些符合自己视频的背景音乐,又找不到背景音乐的源音乐,这时候就需要有软件帮助提取背景音乐了. 项目简介 这是基于C#开发的UI界面,支持中文等多 ...

  4. 从原理到应用,人人都懂的ChatGPT指南

    作者:京东科技 何雨航 引言 如何充分发挥ChatGPT潜能,已是众多企业关注的焦点.但是,这种变化对员工来说未必是好事情.IBM计划用AI替代7800个工作岗位,游戏公司使用MidJourney削减 ...

  5. sklearn中的KFold简单介绍

    这一部分主要讲解关于什么是K-foldCV(K折交叉验证),简单的使用一些案例进行分析,然后使用sklearn库函数中一些简单的案例进行分析. 在机器学习中,多数最主要的功能函数被封装到sklearn ...

  6. 2023-04-17:设计一个包含一些单词的特殊词典,并能够通过前缀和后缀来检索单词。 实现 WordFilter 类: WordFilter(string[] words) 使用词典中的单词 wor

    2023-04-17:设计一个包含一些单词的特殊词典,并能够通过前缀和后缀来检索单词. 实现 WordFilter 类: WordFilter(string[] words) 使用词典中的单词 wor ...

  7. 2022-06-14:数组的最大与和。 给你一个长度为 n 的整数数组 nums 和一个整数 numSlots ,满足2 * numSlots >= n 。总共有 numSlots 个篮子,编号为 1

    2022-06-14:数组的最大与和. 给你一个长度为 n 的整数数组 nums 和一个整数 numSlots ,满足2 * numSlots >= n .总共有 numSlots 个篮子,编号 ...

  8. Django4全栈进阶之路20 项目实战(在线报修):项目需求分析

    为了实现一个在线报修系统,您可以按照以下步骤进行: 创建Django项目和应用 使用Django的命令行工具创建一个Django项目,并在该项目中创建一个名为"RepairApp" ...

  9. wmi搜集一台计算机的硬件信息

    作用: Python搜集一台计算机的硬件信息,借助模块:wmi,这个模块只支持window操作系统. 安装: pip install wmi 导入: import wmi 实例 c = wmi.WMI ...

  10. 【HDU】1312 Red andBlack (DFS&BFS经典好题)

    Red and Black 题目 我是题目链接 题解 找出所能到达的所有黑色的数量,用DFS和BFS均可. BFS: #include <iostream> #include <qu ...