前几天了解到正则语法和有穷自动机的等价性,因此特意来复习一下RE的基本用法(太久没用了,手生)。日常来说,正则表达式的主要方法是re.method()这样的模式串匹配,一共有四种常用方法:
re.match(pattern, string[, flags])
从首字母开始开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None,若要完全匹配,pattern要以$结尾。
若匹配成功,match()/search()返回的是Match对象,finditer()返回的也是Match对象的迭代器,获取匹配结果需要调用Match对象的group()、groups或group(index)方法。
1. 正则表达式中的三组括号把匹配结果分成三组
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。 |
2. 没有匹配成功的,re.search()返回None
3. 当然郑则表达式中没有括号,group(1)肯定不对了。举个例子:
import re a = "123abc456" print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整体 print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #123 print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #abc print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) #456
不同于re.method()这种模式,正则包还提供了一种直接用compile返回的正则表达式对象作为主体的函数类型,究其本质其实和原本的模式串匹配一样。RgexObject实例有一些方法和属性:
如果没有匹配到的话,match() 和 search() 将返回 None。如果成功的话,就会返回一个 `MatchObject` 实例,其中有这次匹配的信息:它是从哪里开始和结束,它所匹配的子串等等。
函数re.complie将正则表达式(以字符串书写的)转换为模式对象(即上文所提到的:RegexObject),可以实现更有效率的匹配。如果在调用search或者match函数的时候使用字符串表达的正则表达式,它们也会在内部将字符串转换为正则表达式对象。
在学习正则表达式之初会有点困难。学习他们的关键是一次只学习一点--查找满足特定任务需要的那部分内容,预先将它们全部记住是没有必要的。但是预先需要一个概念,才知道哪里找,怎么找。