Python基础11——正则表达式

半臻
• 阅读 2005

19 正则表达式

19.1 正则基础

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

应用场景

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

re 模块

match方法

# 通过正则表达式对字符串进行匹配

import re

# 使用match方法进行匹配操作
# re.match() 从字符串的开始位置进行匹配,
# 匹配成功,返回match对象。
# 匹配失败,返回None
# res = re.match(正则表达式,要匹配的字符串)
# 匹配到数据,使用group方法提取数据
# print(res.group())

# 例子,判断字符串是否满足正则表达式。 只会从开头进行匹配
name = re.match("卡","卡夫卡")
print(name) #打印match对象
print(name.group()) #打印匹配到的数据

name = re.match("卡","夫卡")
print(name) # None 

name = re.match("fire","firefox")
print(name.group())  #返回fire

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 匹配非单词字符

res = re.match(".","年轻人不讲武德")
print(res.group()) # 匹配第一个字符
# 年

res = re.match("..","年轻人不讲武德")
print(res.group()) # 匹配前两个字符
# 年轻

# [] 匹配 [ ]中列举的字符
res = re.match('[网东]','网上的东西都是虚拟的')
print(res.group()) # 网

# 匹配数字
res = re.match('\d','你好啊,123456')
res = re.match('[0-9]','你好啊,123456')
res = re.match('[0-46-9]','你好啊,123456') #不匹配数字5
res = re.match('[a-zA-Z]','Hello') #匹配所有的大小写字母

# 匹配数字0,1,2,3,4,5,6,7,8,9
res = re.match('\d','123456')

# 匹配非数字
res = re.match('\D','105°的蒸馏水')

# 匹配空白
res = res.match("\s","匹配空白 的字符串")

# 匹配非空白
res = res.match("\S","匹配空白 的字符串")

# 匹配单词字符
res = res.match("\w","匹配空白 的字符串")
# 匹配非单词字符
res = res.match("\W","匹配空白 的字符串")

19.1.3 匹配多个字符

字符 功能
* 出现0次到无限次
+ 出现1次到无限次
? 出现0次或者出现1次
{m} 出现m次
{m,n} 出现m次n次

# 匹配多个字符
# 1 * 匹配前一个字符出现0次或者无限次

import re

res = re.match("\w","小白")
print(res.group())

res = re.match("\w*","小白") #\w出现0次到无限次
print(res.group())

res = re.match("\d*","小王")
print(res.group())

res = re.match("\d+","哈哈哈123")
print(res.group())


res = re.match("\s?","123456")
print(res.group())


# {m}匹配前一个字符出现m次
res = re.match("\w{6}","qwerty123") #出现6次
print(res.group())

res = re.match("\w{6,12}","qwerty123") #最少是6位,最多是12位 
print(res.group())

19.1.4 匹配开头和结尾

字符 功能
^ 匹配字符串开头
$ 匹配字符串结尾

# 1. ^ 匹配字符串开头
# ^ 表示以什么开头、表示对什么取反

import re
res = re.match("^ab","abcd") #表示以ab开头

# 注意 ^在[]中才表示不匹配
res = re.match('[^ab]','abcd') # 表示匹配不是ab的字符
print(res.group())

# [abc] 表示满足abc中的一个
# ^[abc] 开头满足abc中的一个
# [^abc] 匹配除了abc之外的字符


res = re.match(".*e$","hello")  #以e结尾
print(res.group())


19.2 高级用法

19.2.1 匹配分组

字符 功能
| 匹配左右任意一个表达式
(ab|cd) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串
import re

# | 匹配左右任意一个表达式

res = re.match("\d","10")
print(res.group())


# 满足\d 和 100 中任意一个即可
res = re.match("\d|100","100")
print(res.group())

res = re.match("\w*","hello@163.com")
print(res.group())

# 满足 qq 、163 、 129 满足任意一个即可
res = re.match("\w@(qq|163|129).com","hello@163.com")
print(res.group())

# (\w*) 是一个分组 , \1则引用第一个分组,即(\w*)
# 所以<(\w*)>\w*</\1>  等价于  <(\w*)>\w*</(\w*)>
res = re.match(r"<(\w*)>\w*</\1>","<html>python</html>")


# <(\w*)>(\d*)</\2> 等价于 <(\w*)>(\d*)</(\d*)>
# res = re.match(r"<(\w*)>(\d*)</\2>","<html>python</html>")


# (?P<name>)
# 给(\w*) 起别名n1 ,  通过?P=n1 引用标签n1
res = re.match(r"<(?P<n1>\w*)>\w*</?P=n1>","<html>python</html>")


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

li = ["www.baidu.com","www.123.com","www.taobao.com","www.en.n"]

for each in li:
    res = re.match('.*(.com|.cn)',each)
    print(res.group())


19.2.2 其他函数

  1. match 从头开始匹配 返回object 匹配一次 ,最不常用
  2. search() 会扫描整个字符串并返回第一个成功的匹配, 较常用
  3. findall() 以列表形式返回匹配到的字符串, 最常用
  4. sub() 将匹配到的数据进行替换
  5. split() 根据匹配进行切割字符串,并返回一个列表

# search 函数 和 match函数有点类似
# match  函数: 从开始位置匹配
# search 函数:扫描全部,找到第一个匹配成功的数据

res1 = re.match("ab","12abwe")
res2 = re.search("ab","12abwe")
print(res1.group())
print(res2.group())

# findall()  以列表形式返回匹配到的字符串
# 从头到尾匹配,找到所有匹配成功的数据,返回一个列表
res = re.findall('ab','12abweabty')
print(res)

# sub()  将匹配到的数据进行替换
# sub(正则表达式,新内容,字符串,指定替换的次数)
res = re.sub("5","800","今天打了5把斗地主") #把5替换为800
print(res)

res = re.sub("\d","800","今天打了5把斗地主") #所有的数字都换成800
print(res)

res = re.sub("\d","800","今3天打了5把斗4地主",2) #只把前2个数字替换为800
print(res)




# split(正则表达式,字符串,指定的最大分割次数)
res = re.split(';','a b;c 12') #按照;进行分割
print(res)

res = re.split("\d",'das1sda2w6sq') #按照数字进行分割
print(res)

res = re.split("\d",'das1sda2w6sq',2) #只切割前2个 

19.3 贪婪与非贪婪

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

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

# 贪婪匹配
res = re.match("ab*","abbbbb")
print(res.group())
# 输出结果
# abbbbb


# 非贪婪匹配
# 在 * , + , {m,n} 等后面加上? ,表示使贪婪变成非贪婪
res = re.match("ab*?","abbbbb") #非贪婪匹配
print(res.group())
# 输出结果
# a

res = re.match("ab+?","abbbbb")
print(res.group())
# 输出结果
# ab

res = re.match("t{2,4}?","tttttt")  #非贪婪匹配
print(res.group())
# 输出结果
# tt

19.4 原生字符串

在字符串前加上r表示原生字符串


# 正则表达式中,需要匹配\那么需要用到 \\\\  进行匹配
res = re.match('\\\\de','\def')
res = re.match(r"\\de",'\def')

res = re.match(r"c:\\","c:\a\b")
点赞
收藏
评论区
推荐文章
blmius blmius
1年前
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:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
Stella981 Stella981
11个月前
Python3正则表达式
在Python中使用正则表达式 =============== > Python语言通过标准库中的 **re模块** (`import re`)支持正则表达式。 使用 match 方法匹配字符串 ---------------- * 匹配字符串也就是设定一个文本模式,然后判断另外一个字符串是否符合这个文本模式。 import re
Stella981 Stella981
11个月前
KVM调整cpu和内存
一.修改kvm虚拟机的配置 1、virsh edit centos7 找到“memory”和“vcpu”标签,将 <name>centos7</name> <uuid>2220a6d1-a36a-4fbb-8523-e078b3dfe795</uuid>
Stella981 Stella981
11个月前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有`time`,和`datetime`两个,本文先说`time`模块。 ### 关于时间戳的几个概念 * 时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。 * 时间元组(`struct_time`),包含9个元素。  `time.struct_time(tm_y
Stella981 Stella981
11个月前
JS学习之路之JavaScript match() 方法
match() 方法,在字符串内找到相应的值并返回这些值,()内匹配字符串或者正则表达式。 该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。 demo1:<script type="text/javascript"> var str="Hello world!" d
Wesley13 Wesley13
11个月前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序 select * from table_name order id desc; 2.按照指定(多个)字段排序 select * from table_name order id desc,status desc; 3.按照指定字段和规则排序 selec
Stella981 Stella981
11个月前
Python正则表达式用法详解
搞懂 Python 正则表达式用法 Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。 re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函
Stella981 Stella981
11个月前
Python中re(正则表达式)模块学习
今天学习了Python中有关正则表达式的知识。关于正则表达式的语法,不作过多解释,网上有许多学习的资料。这里主要介绍Python中常用的正则表达式处理函数。 re.match -------- re.match 尝试从**字符串的开始**匹配一个模式,如:下面的例子匹配第一个单词。 ![复制代码](http://static.oschina.net
Wesley13 Wesley13
11个月前
PHP中的NOW()函数
是否有一个PHP函数以与MySQL函数`NOW()`相同的格式返回日期和时间? 我知道如何使用`date()`做到这一点,但是我问是否有一个仅用于此的函数。 例如,返回: 2009-12-01 00:00:00 * * * ### #1楼 使用此功能: function getDatetimeNow() {
helloworld_34035044 helloworld_34035044
2个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。 uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid() 或 uuid(sep)参数说明:sep 布尔值,生成的uuid中是否包含分隔符'',缺省为