Re 模块

时间:2021-02-07 18:20:17

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)