Python 基础--正则表达式

本文详细介绍了正则表达式的概念与语法,包括字符匹配、边界匹配、分组匹配等核心内容,并通过Python的re模块进行实战演示,如文本搜索、替换、分割等常见操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是正则表达式

1、使用单个字符串来描述匹配一系列符合某个句法规则的字符串
2、是对字符串操作的一种逻辑公式
3、应用场景:处理文本和数据
4、正则表达式过程:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功,否则匹配失败
练习:查找以字符串“aa”开头的字符串 //以字符串“aa”开头和结尾的字符串//查找以数字和字母开头的字符串(变量)

Python 正则表达式

  • import re :python 正则表达式模块
  • 第一个正则表达式
re.compile(r'imo')  pattern.match('imooc python')
r'imooc'-->Pattern-->Match-->result
strl='imooc python'
strl.find('11') #-1
strl.find('imooc') #0
strl.startswith('imooc')

import re
pa= re.compile(r'imooc') #生成一个Pattern实例
help(pa.match)
ma=pa.match(strl)  #返回一个Match对象
ma.group()  #返回一个字符串或者元组
ma.span()  
ma.string 

pa1=re.compile(r'_')
ma1=pa1.match('_value')
ma1.group()
ma1.groups() #返回元组
pa= re.compile(r'imooc',re.I) #忽略imooc的大小写

#也可以使用ma=re.match(r'imo',str1)这种方式

Python 正则表达式语法

  • . 匹配任意字符(除了\n)
ma=re.match(r'{.}','{a}') 
  • […] 匹配字符集 中的任意一个字符
    匹配{[a-z]}
ma=re.match(r'{[abc]}','{a}')
ma=re.match(r'{[a-z]}','{a}') #匹配a到z中的任意一个字符
  • \d或\D 匹配数字/非数字
  • \s或\S 匹配空白/非空白字符
  • \w或\W 匹配单词字符[a-zA-Z0-9]/非单词字符
ma=re.match(r'[[abc]]','[a]') #ma.group()匹配不到
ma=re.match(r'\[[abc]\]','[a]') #加上转义字符即可
  • * 匹配前一个字符0次或者无限次
ma=re.match(r'[A-Z][a-z]*','Aqerwf')
  • + 匹配前一个字符1次或者无限次
ma=re.match(r'[_a-zA-Z]+[_\w]*','_htl')
  • ? 匹配前一个字符0次或者1次
    匹配0到99的数字: [1-9]?[0-9]
  • {m}/{m,n} 匹配前一个字符m次或者m到n次
    匹配邮箱地址
ma=re.match(r'[a-zA-Z0-9]{6}','abc1234') #匹配到abc123
ma=re.match(r'[a-zA-Z0-9]{6}@163.com','abc1234@163.com')
ma=re.match(r'[a-zA-Z0-9]{6,10}@163.com','abc123456789@163.com')
  • *? /+? /?? 匹配模式变为非贪婪(尽可能少匹配字符)
ma=re.match(r'[0-9][a-z]*?','1bc') #ma.group()返回'1'
ma=re.match(r'[0-9][a-z]*','1bc')  #ma.group()返回'1bc'

Python 正则表达式语法:边界匹配

  • ^ 匹配字符串开头
  • $ 匹配字符串结尾
ma=re.match(r'^[\w]{4,10}@163.com$','abc1234@163.com')
  • \A / \Z 指定的字符串必须出现在开头/结尾
ma=re.match(r'\Aimooc[\w]*','imoocpython') #必须以imooc开头

Python 正则表达式语法:分组匹配

  • | 匹配左右任意一个表达式
ma= re.match(r'abc|d','abc')
ma= re.match(r'abc|d','d')
ma= re.match(r'[1-9]?\d$|100','100') # 能匹配0-100
  • (ab) 将括号中表达式作为一个分组
    匹配163邮箱和126邮箱
ma=re.match(r'^[\w]{4,10}@163.com','abc1234@163.com')
ma=re.match(r'^[\w]{4,10}@(163|126).com','abc1234@126.com')
  • <number> 引用编号为num的分组匹配到的字符串
    常用在判断xml语法的有效性python:
ma=re.match(r'<[\w]+>','<book>') #得到<book>
ma=re.match(r'<([\w]+>)','<book>') #得到<book>
ma=re.match(r'<([\w]+>)\1','<book>') #得到 book>
ma=re.match(r'<([\w]+>)\1','<book>book>') #得到 book>book>
ma=re.match(r'<([\w]+>)[\w]+</\1','<book>python</book>') 
#得到 <book>python</book>
  • (?P<name>) 对分组起一个别名
ma=re.match(r'<(?P<mark>[\w]+>)[\w]+</(?P=mark)','<book>python</book>') 
#得到 <book>python</book>
  • (?P=name) 引用别名为name的分组匹配字符串

Python 正则表达式–re模块其它方法

  • search(pattern,string,flags=0)
    在一个字符串中查找匹配
str1='imooc videonum =1000' #查找数字
info=re.search(r'\d+',str1)
info.group()
  • findall(pattern,string,flags=0)
    找到匹配,返回所有匹配部分的列表
str2='imooc c++=100 java=50,python=70' #查找数字
info2=re.findall(r'\d+',str2)
print info2
  • sub(pattern,repl,string,count=0,flags=0)
    将字符串中匹配正则表达式的部分替换为其它值
    (repl可表示字符串或者表达式,count表示次数)
str3='imooc videonum =1000' #
info3=re.sub(r'\d+','1001',str3)
def add1(match):
    val=match.group()
    num=int(val)+1
    return str(val)
info3=re.sub(r'\d+',add1,str3)#repl为函数
  • split(pattern,string,maxsplit=0,flags=0)
    根据匹配分割字符串,返回分割字符串组成的列表
str4='imooc:C C++ java ,Python'
re.split(r':| |,',str4)

Python 正则表达式–练习

抓取网页中的图片到本地,步骤:

  • 1 抓取网页
  • 2 获取图片地址
  • 3 抓取图片内容并保存到本地
import urllib2
req=urllib2.urlopen('地址')
buf = req.read() 
import re
listurl=re.findall(r'http:.+\.jpg',buf)
i=0
for url in listurl:
    f = open(str(i)+'.jpg','w')
    req=urllib2.urlopen(url)
    buf = req.read
    f.write(buf)
    i+=1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值