正则表达式

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

我们先来看一个正则与 re 模块的例子

判断手机号是否合法

#while 实现
while True:
phone_number = input('please input your phone number : ')
if len(phone_number) == 11 \
and phone_number.isdigit()\
and (phone_number.startswith('') \
or phone_number.startswith('') \
or phone_number.startswith('') \
or phone_number.startswith('')):
print('是合法的手机号码')
else:
print('不是合法的手机号码')
#re 模块实现
import re
phone_number = input('please input your phone number : ')
if re.match('^(13|14|15|18)[0-9]{9}$',phone_number):
print('是合法的手机号码')
else:
print('不是合法的手机号码')

字符组

用法:[字符组]

在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用 [] 表示
字符分为很多类,比如数字、字母、标点等等。
假如你现在要求一个位置 " 只能出现一个数字 ",那么这个位置上的字符只能是 0、1、2...9 这 10 个数之一。

字符

元字符 匹配内容
匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线 (word)
\s 匹配任意的空白符 (space)
\d 匹配数字 (digit)
\n 匹配一个换行符 
\t 匹配一个制表符 
\b 匹配一个单词的结尾
^ 匹配字符串的开始 
$ 匹配字符串的结尾 
\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中字符的所有字符

量词

量词 用法说明
* 重复零次或更多次
+ 重复一次或更多次 
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次 

.*? 的用法

关键字符 用法说明
. 是任意字符
* 是取 0 至 无限长度
? 非贪婪模式

合在一起就是 取尽量少 的任意字符,一般不会这么单独写,他大多用在:(.*?x)取前面任意长度的字符,直到一个x出现的时候

其他重要的字符

字符 用法说明
\ 转义符
{...} {1,2}匹配 1 到 2 次任意字符

贪婪匹配

贪婪格式 用法说明
<.*> 默认为贪婪匹配模式,会匹配尽量长的字符串
<.*?> 加上 ?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串

几个常用的非贪婪匹配(Pattern)

格式 用法
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}?  重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

模块

re 模块

三个非常重要的方法:findall、search、match

findall(找所有)
返回所有满足匹配条件的结果,放在列表里

#findall
ret = re.findall('a','eva egon yuan')
print(ret) ret = re.findall('[a-z]+','eva egon yuan')
print(ret)

获取式子中的整数

#获取整数
ret=re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']
ret.remove('')
print(ret)

search(找一个)
从前往后,找到一个就返回,返回的变量需要调用 group 才能拿到结果
如果没有找到,那么返回 None,调用 group 会报错

#search
ret = re.search('a', 'eva egon yuan').group() #当不使用 group() 调用时,返回的是一个结果的对象
print(ret) ret = re.search('a', 'eva egon yuan')
print(ret) #没有找到值 会报错
ret = re.search('j', 'eva egon yuan').group()
print(ret) #search 的一般用法
ret = re.search('a', 'eva egon yuan')
if ret:
print(ret.group())
#search 结合分组的用法
ret = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','')
print(ret.group())
print(ret.group(1)) #取出第一组
print(ret.group(2)) #取出第二组

给分组命名

#可以在分组中利用?<name>的形式给分组起名字
#获取的匹配结果可以直接用group('名字')拿到对应的值
ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
print(ret.group())
print(ret.group(1))
print(ret.group('tag_name')) ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
#如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致
#获取的匹配结果可以直接用group(序号)拿到对应的值
print(ret.group(1))
print(ret.group()) #结果 :<h1>hello</h1>

match(从头开始找一个) 用法 search 基本一致
match是从头开始匹配,如果正则规则从头开始可以匹配上,就返回一个变量。
匹配的内容需要用 group 才能显示,如果没匹配上,就返回 None,调用 group 时会报错

#match
ret = re.match('a','eva egon,yuan') #没有匹配到
if ret:
print(ret.group()) ret = re.match('e','eva egon,yuan') #匹配到了
if ret:
print(ret.group()) ret = re.match('[a-z]','eva egon,yuan') #匹配到了
if ret:
print(ret.group())

其他重要的方法

方法:split、sub、subn、compile、finditer、split、flags

split
先按 'a' 分割得到 '' 和 'bcd',在对 '' 和 'bcd' 分别按 'b' 分割

#split
ret = re.split('[ab]','abcd')
print(ret) # ['', '', 'cd']

sub
将数字替换成 'H',参数 1 表示只替换 1 个,不写表示替换全部

#sub
ret = re.sub('\d', 'H', 'eva3egon4yuan4',1)
print(ret) #evaHegon4yuan4

subn
将数字替换成 'H',返回元组 ( 替换的结果,替换了多少次 )

#subn
ret = re.subn('\d', 'H', 'eva3egon4yuan4')
print(ret)

compile
一般用于一条正则规则要反反复复使用或一条规则特别长的时候使用

#compile
#将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
obj = re.compile('\d{3}')
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group()) #结果 : 123
ret = obj.search('abcashgjgsdghkash456eeee3wr2') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group()) #结果 : 456

finditer
返回一个存放匹配结果的迭代器,当所找的东西很多时

#finditer
ret = re.finditer('\d', 'ds3sy4784a')
print(ret) # <callable_iterator object at 0x10195f940>
# print(next(ret).group()) #查看第一个结果
# print(next(ret).group()) #查看第二个结果
# print([i.group() for i in ret]) #查看剩余的左右结果
for i in ret:
print(i.group()) # .group()可以取出所有值

分组优先的问题

findall 存在的问题
这是因为 findall 会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

#findall 取值的问题
ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['oldboy'] # 这里使用 ? 来取消分组优先
ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['www.oldboy.com']

split的优先级查询

#split 应该注意的问题
ret=re.split("\d+","eva3egon4yuan")
print(ret) #结果 : ['eva', 'egon', 'yuan'] ret=re.split("(\d+)","eva3egon4yuan")
print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan'] #在匹配部分加上()之后所切出的结果是不同的,
#没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
#这个在某些需要保留匹配部分的使用过程是非常重要的

转义的问题

# r 转义
import re
ret = re.findall(r'\\s',r'\s')
print(ret)

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 字符串可以是多行的,忽略空白字符,并可以添加注释

  
     
          
     
     
  

day 18 - 1 正则与 re 模块的更多相关文章

  1. day 18 - 2 正则与 re 模块练习

    1.爬虫的例子 #爬虫的例子(方法一) import re import urllib,request import urlopen def getPage(url): response = urlo ...

  2. day19 正则,re模块

    http://www.cnblogs.com/Eva-J/articles/7228075.html  所有常用模块的用法 正则的规则: 在一个字符组里面枚举合法的所有字符,字符组里面的任意一个字符和 ...

  3. 正则,re模块

    一.正则表达式(精准匹配) 匹配字符串内容的一种规则 二.字符组 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 常见字符组格式如下:[0123456789],[0-9],[ ...

  4. python正则以及collections模块

    正则 一.认识模块  什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是加上.py的后缀,但其实import加载的模块分为四个通用类别 : 1.使用python编写的代码(.p ...

  5. Python 正则处理_re模块

    正则表达式 动机 文本处理成为计算机常见工作之一 对文本内容搜索,定位,提取是逻辑比较复杂的工作 为了快速方便的解决上述问题,产生了正则表达式技术 定义 文本的高级匹配模式, 提供搜索, 替换, 本质 ...

  6. Learning-Python【18】:Python常用模块(1)—— time、datetime、randrom

    time 模块:与时间相关的功能的模块 在 Python 中,时间分为三种: 1.时间戳:是一个时间的表示,根据不同的语言,可以是整数或浮点数,是从1970年1月1日0时0分0秒到现在经历的秒数 2. ...

  7. day23 正则,re模块

    一. 简谈正则表达式 元字符 . 除了换行符外任意字符. \w 数字.字母.下划线 \s 空白符 \b 单词的末尾 \d 数字 \n 匹配换行符 \t 匹配制表符 \W 除了数字. 字母 下划线 \D ...

  8. python 基础之第十二天(re正则,socket模块)

    In [14]: 'hello-wold.tar.gz'.split('.') Out[14]: ['hello-wold', 'tar', 'gz'] In [15]: import re In [ ...

  9. Python正则、re模块

    正则的概念 findall        match        search  方法 元字符的用法和作用 正则表达式概念 正则表达式是对字符串操作的一种逻辑公式,就是对字符串的一种过滤 可以判断是 ...

随机推荐

  1. equals方法相关总结

    先说一下Object类吧: 这是一个号称为祖宗类的东西,是所有类的父类,也是唯一一个没有父类的类. 接口不继承object类 并且Object类存在于java的lang包中,我们都知道存在于lang包 ...

  2. centos7下kubernetes(11。kubernetes-运行一次性任务)

    容器按照持续运行的时间可以分为两类:服务类容器和工作类容器 服务类容器:持续提供服务 工作类容器:一次性任务,处理完后容器就退出 Deployment,replicaset和daemonset都用于管 ...

  3. java获取类加载路径和项目根路径的5种方法

    // 第一种:获取类加载的根路径 D:\IDEAWorkspace\hs-bluetooth-lock\src\applications\bluetooth-api\target\classes Fi ...

  4. EF Core 遇到“可能会导致循环或多重级联路径”

    在ef core中你可能会设计这样一个实体: public class Customer : Entity,IMustHaveTenant, IHasCreationTime { public Cus ...

  5. 【Atcoder Grand Contest 011 F】Train Service Planning

    题意:给\(n+1\)个站\(0,\dots,n\),连续的两站\(i-1\)和\(i\)之间有一个距离\(A_i\),其是单行(\(B_i=1\))或双行(\(B_i=2\)),单行线不能同时有两辆 ...

  6. SpringCloud(10)使用Spring Cloud OAuth2和JWT保护微服务

    采用Spring Security AOuth2 和 JWT 的方式,避免每次请求都需要远程调度 Uaa 服务.采用Spring Security OAuth2 和 JWT 的方式,Uaa 服务只验证 ...

  7. Linux slave配置

    说明:master机器为Windows,现将一台Linux机器作为slave进行配置.这台Linux机器为CentOS. 1.在Linux slave上的配置 ①创建名为jenkins用户 #sudo ...

  8. hMailServer相关视频教程

    来源:https://www.hmailserver.org/viewtopic.php?f=4&t=34

  9. 4月10日java多线程3

    在之前我学习了java中的Thread 来实现多线程,今日我学习了ThreadGroup.Executor框架.ForkJoin框架.Executor 和ForkJoin都可以直接定义线程池,可以根据 ...

  10. jsp篇 之 Jsp中的内置对象和范围对象

    Jsp中的内置对象: 在jsp页面代码中不需要声明,直接可以使用的对象. 一共有[9个内置对象]可以直接使用. 对象类型           名字 PageContext          pageC ...