re模块提供方法如compile, search, findall, match和其他的方法。这些函数是使用REGEX语法建立了一个模式来处理文本的。
第一个方法:search.
一个基本的搜索工作原理是这样的:
>>> import re
>>> mo = re.search(“hello”,”Hello world, hello Python!”)
re模块中的search需要将第一个参数作为第二个参数的模式。上面那个“hello”是第一个参数,也是一个模式,”Hello world, hello Python!”是第二个参数,是要匹配的字符串。在这种情况下,该模式可以被翻译为“h随后由ello组成”。当找到一个匹配,这个函数返回匹配的对象(在这里,被称为mo)与第一个匹配的信息。如果没有匹配,返回None。这里可以通过显示的方法查询匹配对象:
>>> mo.group() #group()返回REGEX(也即是“hello”这个模式)匹配的字符串,“hello”模式匹配hello,所以用group()会返回匹配的结果,也就是hello
’hello’
>>> mo.span() #span()返回一个包含匹配的(起点,终点)位置元组。
(13, 18)
而用mo.start()和mo.end()分别返回起点和重点:
>>> mo.start()
13
>>> mo.end()
18
当模式未匹配到结果时,会返回None,例如:
>>> mo = re.search("hhello","Hello world,hello python")
>>> print (mo)
None
如果我们想匹配同时匹配“Hello”和“hello”:
>>> import re
>>> mo = re.search(“[Hh]ello”,”Hello world, hello Python!”)
第一个匹配返回:
>>> mo.group()
’Hello’
但是用search好像匹配到一个结果就停止啦,需要用到findall。
第二个方法:findall。
为了找到所有的匹配,而不仅仅是第一个,用findall:
>>> re.findall(“[Hh]ello”,”Hello world, hello Python,!”)
[’Hello’, ’hello’] #这里findall会将所有的匹配结果以列表的形式返回,而不是像search那样返回的是一个匹配对象。
这里findall返回实际匹配的列表,而不是匹配对象。
search和findall的区别如下:
>>> mo1 = re.findall("[Hh]ello","Hello world, hello Python!")
>>> mo1
['Hello', 'hello']
findall会将匹配的所有结果作为“列表”返回,这里赋给mo1,所以mo1是所有匹配结果的列表。
>>> mo2 = re.search("[Hh]ello","Hello world,hello python")
>>> mo2
<_sre.SRE_Match object; span=(0, 5), match='Hello'>
>>> mo2.group()
'Hello'
但是search返回的只是一个match对象,就想上面mo2的值。要想将match的结果显示出来,就需要用group()。
re.finditer
如果我们希望返回每一个匹配的匹配对象,用finditer方法。作为一个额外的奖励,它不会返回一个列表,而是一个迭代器。这意味着,每次finditer的调用,它返回它们的下一个元素而无需一次计算得到。对任何的迭代,可以优化内存的使用:
>>> re.finditer(“[Hh]ello”,”Hello world, hello Python,!”)
<callable-iterator object at 0xb6f43d8c>
遍历这些结果:
>>> mos = re.finditer(“[Hh]ello”,”Hello world, hello Python,!”)
>>> for x in mos:
print (x.group())
结果是:
Hello
hello
第三个方法:match。
match方法和search一样,可是它只是匹配字符串的开始。当没有模式被找到,它返回None。
>>> mo = re.match(“hello”, “Hello world, hello Python!”)
>>> print mo
None
和search一样,当模式没有找到,它返回None。
>>> mo = re.match(“Hello”, “Hello world, hello Python!”)
>>> mo
<_sre.SRE_Match object at 0xb7b5eb80> #match同search类似,返回的也是一个配对对象,而不是像findall那样返回的是匹配的结果列表。
匹配对象可以被查询得到:
>>> mo.group()
’Hello’
>>> mo.span()
(0, 5)