python模块(二)&re

本文深入解析Python中的正则表达式模块re,详细介绍了普通字符与元字符的匹配规则,包括点号、^、$、*、+、?、{}

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

python模块之re(正则表达式)

正则表达式( re)是一种小型的、高度专业化的编程语言,它内嵌在Python中,并通过 re 模块实现。
字符匹配包括:普通字符,元字符
一 、普通字符:大多数字符和字母都会和自身匹配

import re
ret=re.findall('w\w{2}l','hello world')
print(ret)          #['worl']

二 、元字符(11个): . ^ $ * + ? { } [ ] | ( ) \
1、. :通配符,代指任意一个字符,除了换行符,只要有就可以,位置任意

ret=re.findall('w..l','hello world')
print(ret)          #['worl']
ret=re.findall('w..l','hello w\n ld')
print(ret)          #[]匹配不成功
ret=re.findall('w..l','hello w\t ld')
print(ret)           #['w\t l']

2、^:指对字符串的开始进行匹配

ret=re.findall('^w..l','hello world')
print(ret)     #[]
ret=re.findall('^w..l','whello world')
print(ret)     #['whel']

3、$:指从字符串后面匹配

ret=re.findall('a..x$','nagilkhilasgx')
print(ret)       #['asgx']

4、 * :重复匹配,匹配*前面的字符0到无穷次,包括可以匹配0次

ret=re.findall('a.*li','hgiakalexlingak')#*重复前面的个数,代表前面字符、任意字符[0-n]
print(ret)
**注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配。**
ret=re.findall('jga*?','abjbvajgaaaaaaaaaaaaa')#*?,按照*最少的匹配进行匹配
print(ret)        #['jg']
ret=re.findall('ba*','gnakogbaaaaaaa')
print(ret)       #['baaaaaaa']
ret=re.findall('.*','gnakogbaaaaaaa')
print(ret)      #['gnakogbaaaaaaa', ''],因为.*匹配0次
ret = re.findall('ab*','kjkjgadgab')
print(ret)     #['a', 'ab']

5、+:重复匹配,指前面个字符,至少有一个字符

ret = re.findall('ab+','jkgkaabhhok')   #['ab'],以ab为整体进行匹配
print(ret)
ret=re.findall('a+b','ghikaaaaaaaaaaaaabjgkjbgaa')
print(ret)      #['aaaaaaaaaaaaab']
ret=re.findall('a.+b','ghikahfhjtyhbjgkjbgaa')
print(ret)      #['ahfhjtyhbjgkjb']

6、?:[0,1]匹配前面可以有0或者1字符

ret=re.findall('a?b','ghikaaaahfabhjtyhbjgkjbgaa')
print(ret)  #['ab', 'b', 'b']

7、{},重复匹配,相匹配多少个字符自己定

ret = re.findall('a{5}b','aaaaaab')
print(ret)    #['aaaaab']
ret = re.findall('a{1,3}b','abaaaaab')#贪婪匹配
print(ret)#['ab', 'aaab']
ret = re.findall('a*b','abaaaaab')#贪婪匹配
print(ret)#['ab', 'aaaaab']
结论:*等于[0,正无穷] , +等价于[1,+正无穷],?等价于[0,1],{1,}等价于[1,正无穷]

8、[]:字符集

ret = re.findall('a[cd]x','acdx')
print(ret)     #[]
ret = re.findall('a[cd]x','adxsafdx')
print(ret)       #['adx']
ret = re.findall('a[c,d,e]x','aex')
print(ret)      #['aex']
ret = re.findall('[a-z]','abx')  #[a-z]表示一个范围
print(ret)       #['a', 'b', 'x']

注意:[]字符集:取消元字符的特殊功能(\ ^ -)。

ret = re.findall('[w*]','aex')
print(ret)    #[]

ret = re.findall('[w**]','awex*')
print(ret)   #['w', '*']

ret = re.findall('[1-9,a-z,A-Z]','1adgX35AH*')
print(ret)    #['1', 'a', 'd', 'g', 'X', '3', '5', 'A', 'H']

ret = re.findall('[1-9a-zA-Z]','1adgX35AH*')
print(ret)     #['1', 'a', 'd', 'g', 'X', '3', '5', 'A', 'H']

ret = re.findall('^iu','iu1adgX35AH*')#^:指对字符串的开始进行匹配
print(ret)#['iu']

ret = re.findall('[^t]','1dtgX3')#^放在[]里,取反,[^t]取反,除了t以为其他都可以。
print(ret)   #['1', 'd', 'g', 'X', '3']

ret = re.findall('[^4,5]','1d5tg4X3')#^是非得意思,非4或者非5
print(ret)     #['1', 'd', 't', 'g', 'X', '3']

9、\ :1、反斜杠后边跟元字符去除特殊功能,2、反斜杠后边跟普通字符实现特殊功能。

\d 匹配任何十进制数,相当于[0,9]
\D 匹配任意非数字字符,相当于 非[0,9]
\s 匹配任意空白字符,相当于 [\t \n \r \f \v]
\S 匹配任意非空白字符,相当于 非[\t \n \r \f \v]
\w 匹配任意字母数字字符,相当于 [1-9a-zA-Z]
\W 匹配任意非字母数字字符,相当于 非[1-9a-zA-Z]
\b 匹配一个单词边界,也就是空格和单词间的位置

print(re.findall('\d{11}','fhaihf38783759475893'))             #['38783759475']

print(re.findall('\D{11}','fhaihfJSYKSUS38783759475893'))      #['fhaihfJSYKS']

print(re.findall('\shf','fhai  hfJSYKSUS38783759475893'))      #[' hf']

print(re.findall('\w','fhai'))         #['f', 'h', 'a', 'i']

print(re.findall(r'am\b','hello ,I am a am$Iihsk'))    #['am', 'am'],$是特殊字符

#匹配出第一个满足条件的结果
ret = re.search('ab','ikhahgiabjkaoab')
print(ret)#<_sre.SRE_Match object; span=(7, 9), match='ab'>
print(ret.group())     #利用group方法输出:ab

ret=re.search('a.','agjak').group()
print(ret)   #ag

ret=re.search('a\.','agjak').group()
print(ret)           #AttributeError: 'NoneType' object has no attribute 'group'

ret=re.search('a\.','a.gjak').group()#'a\.'其实就是.字符,已经取消特殊功能
print(ret)      # a.

ret=re.search('a\+','a+gjak').group()
print(ret)     #a+

ret=re.findall(r'\\','akjgia\e')
print(ret)     #['\\']

ret = re.search(r'\bblow','blow')#r是原生字符串,不需要转义
print(ret.group())    #blow

10、():元字符之分组

print(re.search('(ab)','aghakababhgabsk').group())     #ab    一次匹配

print(re.search('(ab)+','aghakabababhgabsk').group())     ##abab,多次分组匹配,以()内作为分组。

print(re.search('(ab)|3','aghakhg3absk').group())     #3    ,先匹配谁就出来之后就不匹配了。

ret = re.search('(?P<id>\d{3})/(?P<name>\w{3})','fikag1234tgft123/gkjeo')#命名分组
print(ret.group())          #123/gkj
print(ret.group('id'))      #123
print(ret.group('name'))    #gkj

ret=re.findall('\v','adaghhadaf\v')
print(ret)    #['\x0b']

ret=re.findall('\\v','adaghhadaf\v')
print(ret)   #['\x0b']

ret=re.findall('\\\\','abcgkrjg\degankn')
print(ret)   #['\\']

ret=re.findall(r'\\','abcgkr\jgdegankn')
print(ret)   #['\\']

ret = re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city")
print(ret)     #{'province': '3714', 'city': '81', 'birthday': '1993'}

ret = re.findall('www.(\w+).com','www.baidu.com')
print(ret)   #['baidu']#把分组里组的内容取出,按照规则里的组,而不是输出这个地址

ret = re.findall('www.(?:\w+).com','www.baidu.com')#加?:取消组的优先级。
print(ret)

三、正则表达式的方法

1、findall():所有结果都返回到一个列表里
2、search():返回匹配到第一个对象(object),对象可以调用group()方法返回结果
3、match():只在字符串开始匹配
4、finditer()#迭代器

ret=re.match('aefesd','ajgiaasd')
print(ret)   #None

ret=re.match('awfsd','awfsdjgiaasd')
print(ret)   #<_sre.SRE_Match object; span=(0, 5), match='awfsd'>
print(ret.group())  #awfsd

ret=re.split('[o,h]','agoireihg')
print(ret)    #['ag', 'irei', 'g']

ret=re.split('[o,h]','hagoireihg')
#先按o分完分为'hag'和ireihg,按h再分(前和后),先按前h分为''和'ag',再按后h分'irei'和'g
print(ret)  #['', 'ag', 'irei', 'g']

#sub替换
ret = re.sub('a..x','sasb','hgskaahsxgaihg')#'sasb'替换a..x
print(ret)   #hgskasasbgaihg

p = re.compile('\.com') #规则编译一次成为一个对象
ret=p.findall('higahig.comhgakhgai.comi')#通过调用对象的方法则可以进行匹配。
print(ret)   #['.com', '.com']

ret = re.finditer('\d','hgs1kah2kjh356')
print(ret)        #<callable_iterator object at 0x00000000022BD208>
print(next(ret))    #<_sre.SRE_Match object; span=(6, 7), match='1'>
print(next(ret).group())    #1   用group方法取出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值