Python基础11——正则表达式

19 正则表达式

19.1 正则基础

正则表达式: 字符串处理工具

应用场景

  1. html查询
  2. 验证字符串是否符合规则

re 模块

match方法

1# 通过正则表达式对字符串进行匹配 2 3import re 4 5# 使用match方法进行匹配操作 6# re.match() 从字符串的开始位置进行匹配, 7# 匹配成功,返回match对象。 8# 匹配失败,返回None 9# res = re.match(正则表达式,要匹配的字符串) 10# 匹配到数据,使用group方法提取数据 11# print(res.group()) 12 13# 例子,判断字符串是否满足正则表达式。 只会从开头进行匹配 14name = re.match("卡","卡夫卡") 15print(name) #打印match对象 16print(name.group()) #打印匹配到的数据 17 18name = re.match("卡","夫卡") 19print(name) # None 20 21name = re.match("fire","firefox") 22print(name.group()) #返回fire 23

19.1.2 匹配单个字符

字符功能
.匹配任意1个字符(\n除外)
[ ]匹配[ ]中列举的字符
\d匹配数字0,1,2,3,4,5,6,7,8,9
\D匹配非数字,即不是数字
\s匹配空白,即 空格 和 tab键
\S匹配非空白
\w匹配单词字符,即a-z,A-Z,0-9,_,汉字
\W匹配非单词字符
1 2res = re.match(".","年轻人不讲武德") 3print(res.group()) # 匹配第一个字符 4# 年 5 6res = re.match("..","年轻人不讲武德") 7print(res.group()) # 匹配前两个字符 8# 年轻 9 10# [] 匹配 [ ]中列举的字符 11res = re.match('[网东]','网上的东西都是虚拟的') 12print(res.group()) # 网 13 14# 匹配数字 15res = re.match('\d','你好啊,123456') 16res = re.match('[0-9]','你好啊,123456') 17res = re.match('[0-46-9]','你好啊,123456') #不匹配数字5 18res = re.match('[a-zA-Z]','Hello') #匹配所有的大小写字母 19 20# 匹配数字0,1,2,3,4,5,6,7,8,9 21res = re.match('\d','123456') 22 23# 匹配非数字 24res = re.match('\D','105°的蒸馏水') 25 26# 匹配空白 27res = res.match("\s","匹配空白 的字符串") 28 29# 匹配非空白 30res = res.match("\S","匹配空白 的字符串") 31 32# 匹配单词字符 33res = res.match("\w","匹配空白 的字符串") 34# 匹配非单词字符 35res = res.match("\W","匹配空白 的字符串") 36

19.1.3 匹配多个字符

字符功能
*出现0次到无限次
+出现1次到无限次
?出现0次或者出现1次
{m}出现m次
{m,n}出现m次n次
1 2# 匹配多个字符 3# 1 * 匹配前一个字符出现0次或者无限次 4 5import re 6 7res = re.match("\w","小白") 8print(res.group()) 9 10res = re.match("\w*","小白") #\w出现0次到无限次 11print(res.group()) 12 13res = re.match("\d*","小王") 14print(res.group()) 15 16res = re.match("\d+","哈哈哈123") 17print(res.group()) 18 19 20res = re.match("\s?","123456") 21print(res.group()) 22 23 24# {m}匹配前一个字符出现m次 25res = re.match("\w{6}","qwerty123") #出现6次 26print(res.group()) 27 28res = re.match("\w{6,12}","qwerty123") #最少是6位,最多是12位 29print(res.group()) 30 31

19.1.4 匹配开头和结尾

字符功能
^匹配字符串开头
$匹配字符串结尾
1 2# 1. ^ 匹配字符串开头 3# ^ 表示以什么开头、表示对什么取反 4 5import re 6res = re.match("^ab","abcd") #表示以ab开头 7 8# 注意 ^在[]中才表示不匹配 9res = re.match('[^ab]','abcd') # 表示匹配不是ab的字符 10print(res.group()) 11 12# [abc] 表示满足abc中的一个 13# ^[abc] 开头满足abc中的一个 14# [^abc] 匹配除了abc之外的字符 15 16 17res = re.match(".*e$","hello") #以e结尾 18print(res.group()) 19 20 21

19.2 高级用法

19.2.1 匹配分组

字符功能
|匹配左右任意一个表达式
(ab|cd)将括号中字符作为一个分组
\num引用分组num匹配到的字符串
(?P<name>)分组起别名
(?P=name)引用别名为name分组匹配到的字符串
1import re 2 3# | 匹配左右任意一个表达式 4 5res = re.match("\d","10") 6print(res.group()) 7 8 9# 满足\d 和 100 中任意一个即可 10res = re.match("\d|100","100") 11print(res.group()) 12 13res = re.match("\w*","hello@163.com") 14print(res.group()) 15 16# 满足 qq 、163 、 129 满足任意一个即可 17res = re.match("\w@(qq|163|129).com","hello@163.com") 18print(res.group()) 19 20# (\w*) 是一个分组 , \1则引用第一个分组,即(\w*) 21# 所以<(\w*)>\w*</\1> 等价于 <(\w*)>\w*</(\w*)> 22res = re.match(r"<(\w*)>\w*</\1>","<html>python</html>") 23 24 25# <(\w*)>(\d*)</\2> 等价于 <(\w*)>(\d*)</(\d*)> 26# res = re.match(r"<(\w*)>(\d*)</\2>","<html>python</html>") 27 28 29# (?P<name>) 30# 给(\w*) 起别名n1 , 通过?P=n1 引用标签n1 31res = re.match(r"<(?P<n1>\w*)>\w*</?P=n1>","<html>python</html>") 32 33 34

举例 匹配.com 或 .cn后缀的网址

1li = ["www.baidu.com","www.123.com","www.taobao.com","www.en.n"] 2 3for each in li: 4 res = re.match('.*(.com|.cn)',each) 5 print(res.group()) 6 7 8

19.2.2 其他函数

  1. match 从头开始匹配 返回object 匹配一次 ,最不常用
  2. search() 会扫描整个字符串并返回第一个成功的匹配, 较常用
  3. findall() 以列表形式返回匹配到的字符串, 最常用
  4. sub() 将匹配到的数据进行替换
  5. split() 根据匹配进行切割字符串,并返回一个列表
1 2# search 函数 和 match函数有点类似 3# match 函数: 从开始位置匹配 4# search 函数:扫描全部,找到第一个匹配成功的数据 5 6res1 = re.match("ab","12abwe") 7res2 = re.search("ab","12abwe") 8print(res1.group()) 9print(res2.group()) 10 11# findall() 以列表形式返回匹配到的字符串 12# 从头到尾匹配,找到所有匹配成功的数据,返回一个列表 13res = re.findall('ab','12abweabty') 14print(res) 15
1 2# sub() 将匹配到的数据进行替换 3# sub(正则表达式,新内容,字符串,指定替换的次数) 4res = re.sub("5","800","今天打了5把斗地主") #把5替换为800 5print(res) 6 7res = re.sub("\d","800","今天打了5把斗地主") #所有的数字都换成800 8print(res) 9 10res = re.sub("\d","800","今3天打了5把斗4地主",2) #只把前2个数字替换为800 11print(res) 12 13 14 15 16# split(正则表达式,字符串,指定的最大分割次数) 17res = re.split(';','a b;c 12') #按照;进行分割 18print(res) 19 20res = re.split("\d",'das1sda2w6sq') #按照数字进行分割 21print(res) 22 23res = re.split("\d",'das1sda2w6sq',2) #只切割前2个 24

19.3 贪婪与非贪婪

贪婪匹配: 在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪模式

非贪婪模式:在满足匹配时,匹配尽可能短的字符串,使用**?**来表示非贪婪匹配

1# 贪婪匹配 2res = re.match("ab*","abbbbb") 3print(res.group()) 4# 输出结果 5# abbbbb 6 7 8# 非贪婪匹配 9# 在 * , + , {m,n} 等后面加上? ,表示使贪婪变成非贪婪 10res = re.match("ab*?","abbbbb") #非贪婪匹配 11print(res.group()) 12# 输出结果 13# a 14 15res = re.match("ab+?","abbbbb") 16print(res.group()) 17# 输出结果 18# ab 19 20res = re.match("t{2,4}?","tttttt") #非贪婪匹配 21print(res.group()) 22# 输出结果 23# tt

19.4 原生字符串

在字符串前加上<font color="red">r</font>表示原生字符串

1 2# 正则表达式中,需要匹配\那么需要用到 \\\\ 进行匹配 3res = re.match('\\\\de','\def') 4res = re.match(r"\\de",'\def') 5 6res = re.match(r"c:\\","c:\a\b") 7
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''

Python3正则表达式

在Python中使用正则表达式Python语言通过标准库中的re模块(importre)支持正则表达式。使用match方法匹配字符串匹配字符串也就是设定一个文本模式,然后判断另外一个字符串是否符合这个文本模式。importre