【python学习】用正则表达式匹配查找文本

学习自书本《Python编程快速上手——让繁琐工作自动化》

正则表达式

#正则表达式
import re
aRegex=re.compile('\d\d\d-\d\d\d-\d\d\d\d')
mo=aRegex.search('我的电话号码是:123-456-7890')
print('找到句子中的匹配内容为:',mo.group())

输出结果:

找到句子中的匹配内容为: 123-456-7890

利用括号分组

#利用括号分组
import re
aRegex=re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
mo=aRegex.search('我的电话号码是:123-456-7890')
print('mo.group()',mo.group())
print('mo.group(0)',mo.group(0))
print('mo.group(1)',mo.group(1))
print('mo.group(2)',mo.group(2))
print('mo.groups()',mo.groups())
areaCode,mainNumber=mo.groups()
print('areaCode是{},mainNumber是{}'.format(areaCode,mainNumber))
#如果需要在文本中匹配括号,需要用倒斜杠对左右括号进行字符转义
aRegex2=re.compile(r'(\(\d\d\d\))(\d\d\d-\d\d\d\d)')
mo2=aRegex2.search('我的电话号码是:(123)456-7890')
print('mo2.group(1)',mo2.group(1))
print('mo2.group(2)',mo2.group(2))

输出结果:

mo.group() 123-456-7890
mo.group(0) 123-456-7890
mo.group(1) 123
mo.group(2) 456-7890
mo.groups() ('123', '456-7890')
areaCode是123,mainNumber是456-7890
mo2.group(1) (123)
mo2.group(2) 456-7890

用管道匹配多个分组

#用管道匹配多个分组
import re
bRegex=re.compile(r'zhangsan|li si')
mo1=bRegex.search('zhangsan and li si')
#第一次出现的匹配对象将被返回
print('mo1.group()',mo1.group())
cRegex=re.compile(r'zhang(san|si|wu)')
mo2=cRegex.search('zhangsan and zhangsi')
print('mo2.group()',mo2.group())
print('mo2.group(1)',mo2.group(1))

输出结果:

mo1.group() zhangsan
mo2.group() zhangsan
mo2.group(1) san

用问号实现可选匹配

#用问号实现可选匹配
import re
#(xiao)?可选分组,出现零次或一次
dRegex=re.compile(r'li(xiao)?si')
mo1=dRegex.search('有个人叫lisi')
print('mo1.group()',mo1.group())
mo2=dRegex.search('他儿子叫lixiaosi。')
print('mo2.group()',mo2.group())
#尝试用来匹配不管包不包含区号
eRegex=re.compile(r'(\d\d\d-)?\d\d\d-\d\d\d\d')
mo3=eRegex.search('电话号码是:123-456-7890')
print('mo3.group()',mo3.group())
mo4=eRegex.search('电话号码是:456-7890')
print('mo4.group()',mo4.group())

输出结果:

mo1.group() lisi
mo2.group() lixiaosi
mo3.group() 123-456-7890
mo4.group() 456-7890

用星号匹配零次或多次

#用星号匹配零次或多次
import re
fRegex=re.compile(r'li(xiao)*si')
mo1=fRegex.search('有个人叫lisi')
print('mo1.group()',mo1.group())
mo2=fRegex.search('他儿子叫lixiaosi。')
print('mo2.group()',mo2.group())
mo3=fRegex.search('他孙子叫lixiaoxiaosi。')
print('mo3.group()',mo3.group())
mo4=fRegex.search('他曾孙叫lixiaoxiaoxiaosi。')
print('mo4.group()',mo4.group())

输出结果:

mo1.group() lisi
mo2.group() lixiaosi
mo3.group() lixiaoxiaosi
mo4.group() lixiaoxiaoxiaosi

用加号匹配一次或多次

#用加号匹配一次或多次
import re
gRegex=re.compile(r'li(xiao)+si')
mo1=gRegex.search('有个人叫lisi')
#print('mo1.group()',mo1.group())
if mo1==None:
    print('这个人不存在')
mo2=gRegex.search('他儿子叫lixiaosi。')
print('mo2.group()',mo2.group())
mo3=gRegex.search('他孙子叫lixiaoxiaosi。')
print('mo3.group()',mo3.group())
mo4=gRegex.search('他曾孙叫lixiaoxiaoxiaosi。')
print('mo4.group()',mo4.group())

输出结果:

这个人不存在
mo2.group() lixiaosi
mo3.group() lixiaoxiaosi
mo4.group() lixiaoxiaoxiaosi

用花括号匹配特定次数

#用花括号匹配特定次数
import re
hRegex=re.compile(r'(ha){3}')
mo1=hRegex.search('hahahalalala')
print('mo1.group()',mo1.group())
mo2=hRegex.search('ha')
if mo2==None:
    print('(ha){3}只能匹配到hahaha')
iRegex=re.compile(r'(ha){3,5}')
mo3=iRegex.search('hahalalalahahahahaha')
print('mo3.group()',mo3.group())

输出结果:

mo1.group() hahaha
(ha){3}只能匹配到hahaha
mo3.group() hahahahaha

用findall()获取所有匹配结果

#用findall()获取所有匹配结果
import re
jRegex=re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
result1=jRegex.findall('张三电话123-456-7890,李四电话234-567-8901')
print(result1)
kRegex=re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)')
result2=jRegex.findall('张三电话123-456-7890,李四电话234-567-8901')
print(result2)

输出结果:

['123-456-7890', '234-567-8901']
['123-456-7890', '234-567-8901']

#书上说如果在正则表达式中有分组,findall会返回元组的列表,但我运行后没有,不知道为什么。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值