Python基础之re模块(正则表达式)
就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,
并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
字符匹配又分为两种:
一、普通字符:
大多数字符和字母都会和自身进行匹配。
import re
ret = re.findall("admin","hello administrator") #这是字符串的完整匹配
print(ret)
---------输出结果-----------
['admin']
二、元字符:
元字符符号包括:" . ^ $ * + ? {} [] () \ | "。
下面我们就来详细看看具体的含义和用法:
1、元字符之 . ^ $ * + ? {} :
ret = re.findall("a...n","hello administrator") #"."表示所有除\n之外的任何单个字符
print(ret) #-----> ['admin'] ret = re.findall("^h...o","hello administrator") #匹配输入字符串的开始位置
print(ret) #-----> ['hello'] ret = re.findall("r...r$","hello administrator") #匹配输入字符串的结束位置
print(ret) #-----> ['rator'] ret = re.findall("abc*","abccccc") #匹配前面的子表达式零次或多次
print(ret) #-----> ['abccccc'] ret = re.findall("abc+","abccccc") #匹配前面的子表达式一次或多次
print(ret) #-----> ['abccccc'] ret = re.findall("abc?","abccccc") #匹配前面的子表达式零次或一次
print(ret) #-----> ['abc'] ret = re.findall("abc{1,3}","abccccc") #{}自定义c出现的次数
print(ret) #-----> ['abccc']
注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成非贪婪匹配(惰性匹配)。
ret = re.findall("abc+?","abccccc") #非贪婪匹配
print(ret) #-----> ['abc']
ret = re.findall("abc*?","abcccc") #非贪婪匹配
print(ret) #-----> ['ab']
2、元字符之字符集[ ] :(起一个 或者 的意思),注意:. 、* 、+等元字符都是普通符号, - ^ \ 这几个有特殊意义
ret = re.findall("a[bc]d","abd") #匹配a和d之间有b或者c
print(ret) #-----> ['abd']
ret = re.findall("a[bc]d","acd") #匹配a和d之间有b或者c
print(ret) #-----> ['acd'] ret = re.findall("[a-z]","hello") #匹配a-z之间的所有字母
print(ret) #-----> ['h', 'e', 'l', 'l', 'o'] ret = re.findall("[.*+?]","a.b*c+d?e") #在[ ]'.*+?'里没有特殊意义了,就是普通的字符
print(ret) #-----> ['.', '*', '+', '?']
#在字符集里有功能的符号:-(定义一个范围) ^(取反) \(转义) ret = re.findall("[0-9]","12ab34cd56ef") #取出所有的数字
print(ret) #-----> ['1', '2', '3', '4', '5', '6'] ret = re.findall("[^ab]","12ab34cd56ef") #不取出ab
print(ret) #-----> ['1', '2', '3', '4', 'c', 'd', '5', '6', 'e', 'f'] ret = re.findall("[\d]","12ab34cd56ef") #相当于[0-9]
print(ret) #-----> ['1', '2', '3', '4', '5', '6']
3、元字符之转义符 \ :
反斜杠后边跟元字符去除特殊功能,比如\.,此时.就没有特殊意义了,就是一普通字符。
反斜杠后边跟普通字符实现特殊功能,详见下文:
\d 匹配任何十进制数;它相当于类 [0-9]
\D 匹配任何非数字字符;它相当于类 [^0-9]
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b 匹配一个特殊字符边界,比如空格 ,&,#等
ret = re.findall("I\b","I am LIST") #此时结果为空,因为\b对应ASCII有特殊含义
print(ret) #-----> [] ret = re.findall(r"I\b","I am LIST") #r表示原生字符,里面的都没有特殊意义了
print(ret) #-----> ['I'] ret = re.findall("I\\b","I am LIST") #在\b前加一个\转义,此时\b就没有特殊意义了
print(ret) #-----> ['I'] # ret = re.findall("a\l","a\lmn") #这个直接报错
# ret = re.findall("a\\l","a\lmn") #这个也会报错
ret = re.findall("a\\\\l","a\lmn") #此时为什么会有那么多 (\) 呢?请看下文详解
#因为我们前文也介绍过,正则表达式是内嵌在Python里的一种专业的编程语言,
#因为 (\) 是有特殊含义的元字符,so,我们就应该给它转义以下,so,应为 (\\),我们
#要知道,Python解释器要先识别,然后把识别结果在交给正则表达式来处理,所以,
#就应该有 (\\\\) 来进行转义,在这里其实,三个转义符,也是可以的,怎么理解呢,两个
#转义符(\\)经过Python识别后变成(\),这个 (\) 加上后面的 (\),就成了两个(\\),这时,
#正则表达式就能识别经过转义后的普通\字符了。
print(ret) #-----> ['a\\l']
ret = re.findall(r"a\\l",r"a\llmn") #加上r使Python识别为原生字符,
# 然后在两个\\交给正则表达式来处理,不然就会报错了。
print(ret) #-----> ['a\\l']
下面我们就来看看,一些有着特殊意义的字符,如:见图中的一些转义字符。
ret = re.findall("\\blike","I like manlike the motorcycle trip")
print(ret) #-----> ['like'] #这里加上\b后,就只能匹配到一个like了。 ret = re.findall(r"\\book",r"pen\book") #因为\b有特殊的意义,跟上文一样
print(ret) #-----> ['\\book'] #这里里面的两个(\\),是因为正则表达式要传给Python
#自动加上了(\)了,我们可只看成['\book']
4、元字符之分组 ( ):
4.1、普通分组:
ret = re.findall("(ad)+","dadadadddd") # 在一个连续的字符串里匹配到括号里的内容后,就停止匹配了
print(ret) #-----> ['ad'] ret = re.findall("(ad)+min","administrator") #会优先显示分组,即括号里的内容
print(ret) #-----> ['ad'] ret = re.findall("(ad)+min","adm admin administrator") #非连续的字符串里匹配到内容后,优先显示分组
print(ret) #-----> ['ad', 'ad'] ret = re.findall("(?:ad)+min","adm admin administrator adadmin") #括号里前面加上?:取消分组的优先级,就没有特殊意义了
print(ret) #-----> ['admin', 'admin', 'adadmin']
4.2、命名分组:
ret = re.search(r"(?P<name>\w+):(?P<age>\d+)","michael:18") #对自己想取的部分进行命名操作
print(ret.group("name")) #通过自己设的组名,得到对应的值
print(ret.group("age")) #通过自己设的组名,得到对应的值
----------------输出结果--------------
michael
18
5、元字符之 | :或的意思
ret = re.findall("a|b","a") #a或者b符合条件,这里是a
print(ret) #-----> ['a']
ret = re.findall("a|b","b") #a或者b符合条件,这里是b
print(ret) #-----> ['b']
ret =re.search("\D+|\d+","123456") #数字字符与非数字字符,这里是数字
print(ret.group()) #-----> 123456 ret = re.search("\D+|\d+","admin") #数字字符与非数字字符,这里是非数字
print(ret.group()) #-----> admin
#|是或者的意思,即在前面的条件里,选一个。
三、re模块下的常用方法:
我们一起来总结一下都有哪些方法:
#1、findall:匹配所有满足条件的结果
ret = re.findall("ad","admin") #返回所有满足匹配条件的结果,放在一个列表里
print(ret) #-----> ['ad'] #2、search:只匹配第一个结果
ret = re.search("ad","admin") #函数会在字符串内查找模式匹配,直到找到
# 第一个匹配然后返回一个包含匹配信息的对象
print(ret.group()) #通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
# -----> ad #3、match:只匹配最开始位置
ret = re.match("ad","admin") #同search,不过只在字符串开始处进行匹配,
# 若开始处,不是匹配的内容,则报错
print(ret.group()) #同上
# -----> ad #4、split:分割
ret = re.split("a","12a34a56") #按"a"分割,得到一个列表
print(ret) # -----> ['12', '34', '56']
ret = re.split("[ab]","a34b56") #先按"a"分割,得到""和"34b56",在对""和"34b56"
#分别按"b"分割,""里没b,就没有效果,so,"34b56"
#被分割为"34"和"56"
print(ret) # -----> ['', '34', '56'] #5、sub、subn:替换
ret= re.sub("B","A","michael:B egon:B") #替换,第一个是定位信息,第二个是修改内容,
print(ret) # -----> michael:A egon:A
ret= re.sub("B","A","michael:B egon:B",1) #这里的1是传给count的值,表示替换的次数
print(ret) # -----> michael:A egon:B
ret = re.subn("B","A","michael:B egon:B") #跟sub比,它返回的是一个替换后的值是一个元组的形式
#后面并且会显示统计替换的次数
print(ret) # -----> ('michael:A egon:A', 2) #6、compile:编译方法
obj = re.compile("\d+")
ret = obj.findall("123admin456") #相当于re.findall("\d+","123admin456")
print(ret) # -----> ['123', '456']
我们需要注意一下:
ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret) #-----> ['oldboy'] 因为findall会优先把匹配结果放在组里将内容返回,
# 如果想要匹配完整结果,取消权限即可 ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret) #-----> ['www.oldboy.com'] 加上(?:)即取消了分组的权限
Python基础之re模块(正则表达式)的更多相关文章
- python基础31[常用模块介绍]
python基础31[常用模块介绍] python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的li ...
- Python中的re模块--正则表达式
Python中的re模块--正则表达式 使用match从字符串开头匹配 以匹配国内手机号为例,通常手机号为11位,以1开头.大概是这样13509094747,(这个号码是我随便写的,请不要拨打),我们 ...
- 十八. Python基础(18)常用模块
十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...
- Python基础-包与模块
Python基础-包与模块 写在前面 如非特别说明,下文均基于Python3 摘要 为重用以及更好的维护代码,Python使用了模块与包:一个Python文件就是一个模块,包是组织模块的特殊目录(包含 ...
- python基础,函数,面向对象,模块练习
---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? # [] {} () None 0 2,位和字节的关系? # ...
- python基础-包和模块
Python基础-包与模块 写在前面 如非特别说明,下文均基于Python3 摘要 为重用以及更好的维护代码,Python使用了模块与包:一个Python文件就是一个模块,包是组织模块的特殊目录(包含 ...
- Python全栈开发之路 【第六篇】:Python基础之常用模块
本节内容 模块分类: 好处: 标准库: help("modules") 查看所有python自带模块列表 第三方开源模块: 自定义模块: 模块调用: import module f ...
- Python基础之--常用模块
Python 模块 为了实现对程序特定功能的调用和存储,人们将代码封装起来,可以供其他程序调用,可以称之为模块. 如:os 是系统相关的模块:file是文件操作相关的模块:sys是访问python解释 ...
- Day5 - Python基础5 常用模块学习
Python 之路 Day5 - 常用模块学习 本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shel ...
- Python基础之re模块
什么是模块? 为了编写可维护的代码,我们把很多的函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式,在Python中,一个.py文件就称为一个模块 ...
随机推荐
- node里面的buffer理解
node提供了专门读写文件的模块,文件内容都是2进制存放在内存中的 node读取文件的结果都是16进制,那么你要学会进制转换,二进制0b开头 ,八进制0开头,十六进制0x 基础知识: 1字节=8bit ...
- P2P的原理和常见的实现方式
参考资料:http://www.cppblog.com/peakflys/archive/2013/01/25/197562.html P2P实现的原理 首先先介绍一些基本概念: NAT(Net ...
- Coconuts HDU - 5925 (二维离散化求连通块的个数以及大小)
题目链接: D - Coconuts HDU - 5925 题目大意:首先是T组测试样例,然后给你n*m的矩阵,原先矩阵里面都是白色的点,然后再输入k个黑色的点.这k个黑色的点可能会使得原先白色的点 ...
- valueForKeyPath用途
可能大家对- (id)valueForKeyPath:(NSString *)keyPath方法不是很了解. 其实这个方法非常的强大,举个例子: NSArray *array = @[@"n ...
- 原子类型的使用&Unsafe&CAS
在项目中也经常可以见到原子类型(AtomicXXX)的使用,而且AtomicXXX常用来代替基本类型或者基本类型的包装类型,因为其可以在不加同步锁的情况下保证线程安全(只对于原子操作). 下面以Ato ...
- dubbo源码分析4——SPI机制_ExtensionFactory类的作用
ExtensionFactory的源码: @SPI public interface ExtensionFactory { /** * Get extension. * * @param type o ...
- 设计模式C++学习笔记之十五(Composite组合模式)
15.1.解释 概念:将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合的使用具有一致性. main(),客户 CCorpNode,抽象基类,实现基本信 ...
- 18春季训练01-3/11 2015 ACM Amman Collegiate Programming Contest
Solved A Gym 100712A Who Is The Winner Solved B Gym 100712B Rock-Paper-Scissors Solved C Gym 100712C ...
- SQL Server 2017 安装详解
SQL server 2017下载链接:https://pan.baidu.com/s/1FSzqJfHQAa0QpZ_fObrfjQ 提取码:1xvb 1.双击iso镜像文件 打开setup ...
- LabVIEW版本控制(转)
原文转自https://www.cnblogs.com/EltonLiang/p/7105034.html 在我们工作中,必然会遇到代码的多个版本问题,也必然会遇到版本控制问题.如果所在的公司具有良好 ...