Python中使用正规表达式实现查找和匹配串

Python的正规表示通过标准库re模块实现,其中包括两种基本操作:
1、使用正规表达式匹配整串;
2、使用正规表达式查找子串。
对应到正规表达式的操作,有两个对象需要涉及,re.RegexObject和re.MatchObject,这两个对象分别代表正规表示本身和匹配信息,对象有一组方法用于设置匹配选项、编译、查找、匹配、查看分组匹配情况等,同时提供有模块级别的对应方法,只是参数中要把模式作为参数输入。

下面举几个例子分别说明使用方法,其中正规表达式的写法可以参看专门的资料或在其它工具和语言中的实现,大同小异。

import re

如果要保存re.RegexObject对象的引用,可以采用如下的方式:

rex = re.compile(r'[A-Za-z]+')
str = 'ABCDefg'
m = rex.match(str)
print m.group(0)

对应地,使用模块方法的方式如下:

str = 'ABCDefg'
m = re.match(r'[A-Za-z]+',str)
print m.group(0)

第二种代码更简洁,带来的坏处是每次执行match方法都要重新编译正规表达式,而使用对象的方法可以保存编译结果,在多次匹配的场景中节省开销。match方法可以指定flag参数改变匹配的行为,不过可以将这些开关合入正规表达式中去,通过使用(?...)的方式达到相同的目的。

rex = re.compile(r'[A-Za-z]+$',re.M)
str = 'ABCDefg\nHIJKlmn\n'
m = rex.match(str)
print m.group(0)

等同于

str = 'ABCDefg\nHIJKlmn\n'
m = re.match(r'[A-Za-z]+$',str,re.M)
print m.group(0)

也等同于

str = 'ABCDefg\nHIJKlmn\n'
m = re.match(r'(?m)[A-Za-z]+$',str)
print m.group(0)

共四种写法,这里就不学孔乙己逐个列出,只要了解达成相同的目的条条道路通罗马就可以了。
另一类应用场景就是查找字符串

str = '123ABCD456efg789'
m = re.search(r'[A-Za-z]+',str)
print m.group(0)

search方法可以限定查找开始和结束的下表位置,在自己希望的区域内完成搜索。
以上就是正规表示最基本的用法,在实际应用中,能体验正规表达式带来好处的地方就是使用模式替换,使用sub方法可以实现这一功能。

str = 'I like spam'#不打算摆脱传统,这玩意可能是Pythoner最喜欢的食品,中国菜中不知道有没有
fin = re.sub(r'spam','banana',str)
print fin

替换操作中可以指定替换的次数和正规表示式的匹配规则,只是设置了默认参数值,直接跟在后面就可以了,具体用法可以参考Python的帮助文档。正规表达式的另一个魔法就是模式分组,在sub方法中匹配的模式分组可以向后引用。

str = 'I like spam'
fin = re.sub(r'(spam)',r'banana and \1',str)
print fin

在Python中另外比较难得的几个支持时look ahead和look back方式的匹配,这好比LR(1)文法解析,通过对下一状态的检测确定自动机当前状态。正规表达式的写法包括几项(?=...)、(?!...)、(?<=...)和(?<!...),另外还支持对分组进行命名,通过查找分组名称执行不同的模式匹配等,这里不再举例,直接草考官方文档。
有个地方官方文档特别提起,这里的表现和其它软件包中的行为不太一样,标记之:

str = 'foo1\nfoo2\n'
rex1 = re.compile(r'foo.$')
m = rex1.search(str)
print m.group(0)
rex2 = re.compile(r'(?m)foo.$')
m = rex2.search(str)
print m.group(0) 




 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值