python正则表达式和re模块

来源:互联网 发布:bi 数据统计是什么 编辑:程序博客网 时间:2024/05/20 19:33

1、python常用正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
re 模块使 Python 语言拥有全部的正则表达式功能。
re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。

这里写图片描述

需要格外解释的是分组,(?P…)省略的部分就是正常的正则匹配,我们把匹配到的这个整体给赋一个变量名字name,在后续调用的时候,就方便多了。

2、re模块
re模块是python中处理正则表达式的一个模块,通过re模块的方法,把正则表达式pattern编译成正则对象,以便使用正则对象的方法。那为什么要使用re模块来把正则表达式搞成正则对象呢,最主要的是可以提高代码的执行效率。例子:

import timeitprint timeit.timeit(setup='''import re; reg = re.compile('<(?P<tagname>\w*)>.*</(?P=tagname)>')''', stmt='''reg.match('<h1>xxx</h1>')''', number=1000000)print timeit.timeit(setup='''import re''', stmt='''re.match('<(?P<tagname>\w*)>.*</(?P=tagname)>', '<h1>xxx</h1>')''', number=1000000)# 1、正则匹配是,优先编译成正则对象,然后在进行匹配,这样程序的效率更高。

结果:

0.6351807744441.63408974105Process finished with exit code 0

说明:
timeit.timeit是用来统计程序执行的时间的,和明显第一个print的执行时间要比第二个的执行时间快好多,这个就是把正则表达是表示成正则对象最明显的好处。

正则匹配总写一个r是什么意思?

r表示raw的简及raw string 意思是原生字符,也就是说是这个字符串中间的特殊字符不用转义
比如你要表示‘\n’,可以这样:r’\n’
但是如果你不用原生字符 而是用字符串你得这样:‘\n’

2.1、re.compile(pattern[, flags])

这个方法是就是将字符串的正则表达式编译城正则对象,第二个参数flag是匹配模式,取值可以使用按位或者运算符“|”表示同时生效,比如:re.I | re.M,flag的可选值有:
re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
M(MULTILINE): 多行模式,改变’^’和’$’的行为
S(DOTALL): 点任意匹配模式,改变’.’的行为
L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的:
a = re.compile(r”“”\d + # the integral part
. # the decimal point
\d * # some fractional digits”“”, re.X)
b = re.compile(r”\d+.\d*”)

import rereg = re.compile(r'abc.*')print(type(reg))print(reg)print(dir(reg))

执行结果:

<type '_sre.SRE_Pattern'><_sre.SRE_Pattern object at 0x0000000001F75B70>['__class__', '__copy__', '__deepcopy__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'findall', 'finditer', 'flags', 'groupindex', 'groups', 'match', 'pattern', 'scanner', 'search', 'split', 'sub', 'subn']Process finished with exit code 0

2.2、正则对象的方法

match方法
match(string[, pos[, endpos]])
string:匹配使用的文本,
pos: 文本中正则表达式开始搜索的索引。及开始搜索string的下标
endpos: 文本中正则表达式结束搜索的索引。
如果不指定pos,默认是从开头开始匹配,如果匹配不到,直接返回None

#正则对象的match匹配import re# reg = re.compile(r'(hello w.*)(hello l.*)')#正则写不完美,造成的匹配不上reg = re.compile(r'\w*(hello w.*)(hello l.*)')print(dir(reg))a = 'hello world hello ling'result = reg.match(a)print(result)print(result.groups())print('@@@@@@@@@@@@@@@@@' * 5)b = 'aa' + aprint(b)result2 = reg.match(b)print(result2)

执行结果:

这里写图片描述

search方法

这个方法用于查找字符串中可以匹配成功的子串。从string的pos下标处起尝试匹配pattern,如果pattern结束时仍可匹配,则返回一个Match对象;若无法匹配,则将pos加1后重新尝试匹配;直到pos=endpos时仍无法匹配则返回None。

#正则对象的match匹配import re# reg = re.compile(r'(hello w.*)(hello l.*)')#正则写不完美,造成的匹配不上reg = re.compile(r'\w*(hello w.*)(hello l.*)')print(dir(reg))a = 'hello world hello ling'result = reg.match(a)print(result)print(result.groups())print('@@@@@@@@@@@@@@@@@' * 5)b = 'aa' + aprint(b)result2 = reg.match(b)print(result2)# 正则对象的search方法做一个比较print('##########################' * 3)result3 = reg.search(b)print(result3)print(result3.group())

结果:
这里写图片描述

split方法

split(string[, maxsplit])
按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。

import rep = re.compile(r'\d+')print(p.split('one1two2three3four4'))

结果:
[‘one’, ‘two’, ‘three’, ‘four’, ”]

说明:直接把p的正则当成是分隔符,然后把最后的字符串用p进行分割,然后返回回去

findall方法

findall(string[, pos[, endpos]])
搜索string,以列表形式返回全部能匹配的子串.

import rep = re.compile(r'\d+')print(findall('one1two2three3four4'))

结果:
[‘1’, ‘2’, ‘3’, ‘4’]
结果:findall是把匹配到的字符串最后一列表的形式返回回去

finditer方法

finditer(string[, pos[, endpos]])
搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。

import rep = re.compile(r'\d+')print(type(p.finditer('one1two2three3four4')))for m in p.finditer('one1two2three3four4'):    print(type(m))print(m.group())

结果:

import rep1 = re.compile(r'\d+')a_str ='one1two222three3four4'# print(p.split('one1two222three3four4'))#正则对象的split方法,使用正则匹配进行分割字符串#最后是列表的形式返回回去print(p1.split(a_str))#正则对象的findall方法,来查找符合对象的子字符串#最后是列表的形式返回回去print(p1.findall(a_str))#for i in p1.finditer(a_str):    print(i.group())    # print(i.groups())

结果:
这里写图片描述

import rep1 = re.compile(r'\d+')a_str ='one1two222three3four4'# print(p.split('one1two222three3four4'))#正则对象的split方法,使用正则匹配进行分割字符串#最后是列表的形式返回回去print(p1.split(a_str))#正则对象的findall方法,来查找符合对象的子字符串#最后是列表的形式返回回去print(p1.findall(a_str))#for i in p1.finditer(a_str):    # print(i.group())    print(i.groups())

结果:
这里写图片描述

match匹配对象

Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。上面的过程中多次使用了match对象,调用了他的group()和groups()等方法。

import reprog = re.compile(r'(?P<tagname>abc)(\w*)(?P=tagname)')result = prog.match('abclfjlad234sjldabc')#finditer 迭代以后每个对象都是一个match对象print(dir(result))print(result)print(result.groups())print(result.group(2))print(result.group(1))print('####'*10 + 'tagname' + '####'*10)print(result.group('tagname'))#match对象的group返回的一个元组,下标是以1开头print(result.groupdict)#输出match的对象print(result.groupdict()

结果:
这里写图片描述

说明:
1、我们可以看到result1已经由字符串转换成了一个正则对象。
2、resule.groups()可以查看出来所有匹配到的数据,每个()是一个元素,最终返回一个tuple
3、group()既可以通过下标(从1开始)的方式访问,也可以通过分组名进行访问。
4、groupdict只能显示有分组名的数据

group([group1, …]):
获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名;编号0代表整个匹配的子串;不填写参数时,返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串。
groups([default]):
以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。default表示没有截获字符串的组以这个值替代,默认为None。
groupdict([default]):
返回以有别名的组的别名为键、以该组截获的子串为值的字典,没有别名的组不包含在内。default含义同上。

原创粉丝点击