Python---正则表达式细节及其主要的用法

正则表达式:正则表达式是一个特殊的字符序列

作用:一个字符串是否与我们所设定的这样的字符序列相匹配,快速检索文本,实现一些替换文本的操作

文章内容:

1.字符集---元字符,普通字符

2.贪婪模式  和  非贪婪模式/精准模式

3.re.sub正则替换

4.re.findall函数、re.match函数、re.search函数

import re

#字符集---元字符,普通字符

#普通字符
a1='abc,afc,aec,dfc,wcc,cab'
b1=re.findall('a[c-f]c',a1)
print(b1)#['afc', 'aec']
c1=re.findall('a[^c-f]c',a1)
print(c1)#['abc']

#元字符
#\d 数字字符 \D 非数字字符
#\w 单词字符 \W 非单词字符
#\s 空白字符
# . 匹配除换行符\n之外的所有字符
a2='5#ef1$&se5&#f1'
b2=re.findall('\d',a2)
print(b2)#['5', '1', '5', '1']
c2=re.findall('[0-9]',a2)#\d==[0-9],同理非数字字符\D==[^0-9]
print(c2)#['5', '1', '5', '1']
d2=re.findall('\w',a2)#单词字符\w==[A-Za-z0-9],非单词字符\W==[^A-Za-z0-9]
print(d2)#['5', 'e', 'f', '1', 's', 'e', '5', 'f', '1']

a3='abcde2fgher5hh'
b3=re.findall('[a-z]{3}',a3)#[a-z]{3}==[a-z][a-z][a-z]
print(b3)#['abc', 'fgh']

a4='python  6,846php44,545'
b4=re.findall('[a-z]{3,6}',a4)#提取'python'和'php'
print(b4)#['python', 'php']

#贪婪与非贪婪?
a5='python  6,846php44,545'
b5=re.findall('[a-z]{3,6}?',a5)#默认贪婪模式,加了?,非贪婪
print(b5)#['pyt', 'hon', 'php']
#*匹配0次或者无限多次
#+匹配1次或者无限多次
#?匹配0次或者1次
a6='pytho446python9pythonn'
b6=re.findall('python*',a6)
print(b6)#['pytho', 'python', 'pythonn']
c6=re.findall('python+',a6)
print(c6)#['python', 'pythonn']
d6=re.findall('python?',a6)
print(d6)#['pytho', 'python', 'python']

#边界匹配
a7='xcd122040356'
b7=re.findall('\d{4,8}',a7)
print(b7)#['12204035']
c7=re.findall('\d{10,12}',a7)
print(c7)#[]
d7=re.findall('\d{4,12}',a7)
print(d7)#['122040356']
e7=re.findall('^\d{4,8}$',a7)#边界匹配,^从字符串x第一个开始匹配,$到6最后一个结束
print(e7)#[]
#^开始,$末尾

#组,()
#[abc]字符之间是一个或关系,(abc)字符之间是一个且关系
a8='PythonPythoPythonPython'
b8=re.findall('(Python)',a8)#()里的Python是一个且关系,每一个字符必须都出现
print(b8)#['Python', 'Python', 'Python']

#匹配模式参数
a9='erb45rE6\nf1'
b9=re.findall('e6',a9,re.I)#匹配时忽略大小写
print(b9)#['E6']
c9=re.findall('e6.{1}',a9,re.I|re.S)
print(c9)#['E6f']


#re.sub正则替换
import re
a1='Pythone#pythone#Python'
a2=re.sub('e#','*',a1)
print(a2)#Python*python*Python
a3=re.sub('e#','*',a1,0)
print(a3)#Python*python*Python
a4=re.sub('e#','*',a1,1)#只替换了第一个
print(a4)#Python*pythone#Python
#可以用.replace完成替换,可以理解成re.sub正则替换的一个简化版
a1.replace('e#','*')
print(a1)#Pythone#pythone#Python,并未完成替换,因为字符串是不可变的
a5=a1.replace('e#','*')
print(a5)#Python*python*Python,生成新的字符串,完成替换

def convert(value):
    return ''
a6=re.sub('e#',convert,a1)
print(a6)#PythonpythonPython

def convert1(value):
    return '!!' + value + '!!'
a7=re.sub('e#',convert1,a1)
print(a7)#TypeError: must be str, not _sre.SRE_Match
#看一下value是什么
def convert2(value):
    print(value)
a8=re.sub('e#',convert2,a1)
print(a8)
#<_sre.SRE_Match object; span=(6, 8), match='e#'>
#<_sre.SRE_Match object; span=(14, 16), match='e#'>
#PythonpythonPython

def convert3(value):
    matched=value.group()
    return '!!' + matched + '!!'
a9=re.sub('e#',convert3,a1)
print(a9)#Python!!e#!!python!!e#!!Python

############把函数作为参数传递
b1='A123B867C75D9E8F'
def convert4(value):
    matched=value.group()
    if int(matched) >=6:
        return '9'
    else:
        return '0'
b2=re.sub('\d',convert4,b1)
print(b2)#A000B999C90D9E9F


########re.match和re.search函数
import re
a1='a1b2c3d4e5f6g7'
a2=re.match('\d',a1)
print(a2)#None
#match尝试从第一个字符开始匹配,为a,返回没有结果
a3=re.search('\d',a1)
print(a3)#<_sre.SRE_Match object; span=(1, 2), match='1'>
#search尝试搜索,一旦有第一个结果1则马上返回结果1

b1='9a1b2c3d4e5f6g7'
b2=re.match('\d',b1)
print(b2)#<_sre.SRE_Match object; span=(0, 1), match='9'>
b3=re.search('\d',b1)
print(b3)#<_sre.SRE_Match object; span=(0, 1), match='9'>
print(b3.group())#9
print(b3.span())#(0, 1)位置跨度
b4=re.findall('\d',b1)
print(b4)#['9', '1', '2', '3', '4', '5', '6', '7']


##############group分组##############
import re
a1='hello#word#hello#word'
a2=re.search('hello(.*)word',a1)#贪婪模式
print(a2)#<_sre.SRE_Match object; span=(0, 21), match='hello#word#hello#word'>
print(a2.group(0))#_hello#word#hello#word
print(a2.group(1))#_#word#hello#
print(a2.group(0,1))#('hello#word#hello#word', '#word#hello#')
print(a2.groups())#('#word#hello#',)
a3=re.findall('hello(.*)word',a1)
print(a3)#['#word#hello#']
a4=re.findall('hello(.*?)word',a1)#非贪婪模式/精准模式
print(a4)#['#', '#']

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值