python渐进-正则模块

正则表达式是一种用来描述字符串结构的表达式。正则表达式一般由字符或者字符集,循环定义,群组定义组成的。

8.1 字符和字符集

1、正则表达式可以匹配所有的字符编码,常用的英文编码和unicode编码都可以。

2、如果直接把字符列成串,那么就只能匹配这个字符串。如’abc’这个正则只能匹配’abc’,u’中文’只能匹配u’中文’.

3、有一些字符是特殊的元字符,拥有特殊的含义。如’.’,’^’,’$’,’*’,’+’,’?’,’{‘,’}’,’[‘,’]’,’\’,’|’,’(‘,’)’。这些字符如果直接用在正则表达式中,需要加’\’来进行转义。

4、在正则表达式中使用’|’,是或的意思。如’abc|d’可以匹配’abc’或者’d’.

5、如果使用’^’,可以匹配开头;’$’则刚好相反,只能匹配结尾。

6、[]可以定义一个字符集。表示当前字符是从这个字符集里面取得。如’1[ab]2’,可以匹配’1a2’和’1b2’.

[]定义字符集可以用’-‘来划定范围。如’[a-z]’表示了当前表示字符是从26个小写字母这个字符集中的一个。

7、除了’^’,所有的元字符在[]里面都是它本来的含义。如[.$*]就是’.’,’$’,’*’三个字符组成的字符集。

8、‘^’在[]里面是取非的意思。如’[^0-9]表示的是非数字。

9、有一些定义好的字符集可以使用。如\d表示了[0-9]这个数字字符集,\D表示了[^0-9]这个非数字字符集;\w表示了[a-zA-Z0-9]这个包括了大小写字母和数字的字符集,\W表示了[^a-zA-Z0-9]这个非大小写字母和数字的字符集;’.’可以匹配任何的字符。[\u4e00-\u9fa5]可以用来匹配unicode的中文字符。

8.2 循环操作

1、如果只是用字符和字符集累积的方式来表示字符串的结构,那么很多字符串的表示都会很复杂。此时需要引入循环。{}就是用来定义循环次数的。

表示最少循环m次,最多n次。

表示最小循环m次,最多无穷。

{,n}表示最少循环0次,最多n次。

2、循环操作可以跟在字符或者字符集的后面,定义这个字符可以循环的次数。比如说’a’匹配的是a循环2次以上的字符串;’[ab]’匹配的是a或b循环2次以上的字符串。

3、同样也有已经定义好的循环操作可以使用。比如说’*’表示循环0次以上;’+’表示循环1次以上;’?’表示循环0次或者1次。

8.3 群组操作

之前的循环操作,都是对一个字符起作用的,如果想要对几个字符一同起作用,那么就需要群组操作把它们包含起来。()操作可以把几个字符形成群组。

比如说(ab),就可以表示ab两个字符一同至少循环2次。

8.4 常用的正则表达式

在实际应用当中常用的正则表达式,如匹配年月日,可以用'\d\D\d\D\d';想要匹配整数,可以用’[1-9]\d*’;想要匹配小数,可以使用’[1-9]\d*\.\d+’。

8.5 python中使用re

python中的re模块可以进行正则表达式的匹配。

如果有一个正则表达式,并且想要用于多次的正则匹配,那么可以对这个正则表达式compile()留用。

>>> import re>>> p=re.compile(r'\d+')

在这里最好对正则表达式进行r操作,这样就不需要对’\d’的’\’进行再转义。如果不使用r操作,字符串传给compile的时候会吃掉一次转义字符,而compile传给正则解析引擎又会吃掉再一次转义字符。因此正则表达式’\d’需要写成’\\\\d’,才能够在传给compile时候为’\\d’,再传给正则解析引擎的时候为正确的’\d’.

在对正则表达式进行了compile之后,就可以对字符串进行匹配了。

python有四种匹配的方法。

match()方法会在字符串开头就寻找匹配的字符串,如果有的话会返回一个match对象。一个match对象可以通过group()来获取匹配的字符串,start()来获取匹配的开始位置,end()来获取匹配的结束位置,span()来获取开始和结束位置的数组。

>>> m=p.match(r'a123')>>> m.group()Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'group'

可以看到match对象的group()方法返回为空,'a123'并不能在开头匹配'\d+'

search()方法在整个字符串中寻找匹配的字符串,如果有的话会返回一个match对象。

>>> s=p.search(r'a123')>>> s.group()'123'

可以看到这个math对象的group()方法返回了匹配的字符串。

无论是match()方法还是search()方法,都只能返回一个匹配的字符串。如果想要把一个字符串里面所有匹配的子字符串都找出来,可以使用findall()或者finditer()。

其中findall()返回的信息比较简单,只能够返回匹配的子字符串list;而finditer(),能够返回match对象的list。

>>> p=re.compile(r'\d+')>>> fa=p.findall(r'a123b456')>>> fa['123', '456']>>> fi=p.finditer(r'a123b456')>>> for fm in fi:... print(fm.group())... print(fm.span())... 123(1, 4)456(5, 8)

对于需要对同一个正则表达式有多次匹配的情况,可以使用compile()生成一个re对象,然后对多种字符串进行匹配。如果需要使用一次,那么也可以直接调用re模块的match(),search(),findall(), finditer()方法

>>> m=re.match(r'\d+','123')>>> m.group()'123'>>> s=re.search(r'\d+','a123')>>> s.group()'123'>>> fa=re.findall(r'\d+',r'a123b456')>>> fa['123', '456']>>> fi=re.finditer(r'\d+',r'a123b456')>>> for fm in fi:... print(fm.group())... print(fm.span())... 123(1, 4)456(5, 8)

调用re模块的这些方法,第一个参数都是正则表达式,第二个参数才是想要匹配的字符串。

除了匹配之外,re模块还能对匹配的字符串进行替换和分割。使用split()方法进行字符串的分割,而使用sub()方法进行字符串的替换。

>>> s=re.split(r'\d+',r'a123b456')>>> s['a', 'b', '']>>> s=re.sub(r'\d+',r'',r'a123b456')>>> s'ab'

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180709G0UGBT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券