【Python】正则表达式进阶

少女dtysky

世界Skill

时刻2015.02.20

很久之前写过一篇正则表达式入门,仅仅说明了正则的一些基础用法,实质上正则还有许多更加实用的方法,比如查找方法、结果格式化等等,能够帮助我们更加高效地完成字符串的处理,这也是多次尝试之后的经验之谈。


1.规则

除了之前提到的一些简单的规则之外,还有一些需要注意的、比较实用的正则规则:

1.{n}系:
在正则规则后加上这个系列可以正好匹配/至少匹配/匹配范围指定数量的字符,例子:

{n}(正好匹配):

>>> test = re.match(r'ba{2}b','bab')
>>> test
>>> 
>>> test = re.match(r'ba{2}b','baab')
>>> test
<_sre.SRE_Match object at 0x000000000276E8B8>

{n,}(至少匹配):

>>> test = re.match(r'ba{1,}b','baab')
>>> test
<_sre.SRE_Match object at 0x000000000276E988>

{n,m}(区间匹配):

>>> test = re.match(r'ba{1,2}b','baaab')
>>> test
>>> 
>>> test = re.match(r'ba{1,2}b','baab')
>>> test
<_sre.SRE_Match object at 0x000000000276E8B8>



2.(?)系:
这个系列是非捕获匹配,捕获的概念在以前的文章已经写过,不再多说,非捕获匹配的好处在于它在某些时候非常经济(不会消耗被匹配的字符串),同时还可以让编写规则变得简单,甚至在于某些比较拿什么的场合(比如sublime的高亮模板编写)的时候,他是非常有用的。同样通过例子来说明:

(?:)(正常非捕获匹配):

>>> test = re.match(r'b(aa)b','baab')
>>> test.group(1)
'aa'
>>> test = re.match(r'b(?:aa)b','baab')
>>> test.group(1)

Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    test.group(1)
IndexError: no such group

(?=)(正向预测):

>>> test = re.match(r'(b(?=abc))','babc')
>>> test.group(1)
'b'
>>> test = re.match(r'(b(?=abc))','bbcd')
>>> test.group(1)

Traceback (most recent call last):
  File "<pyshell#33>", line 1, in <module>
    test.group(1)
AttributeError: 'NoneType' object has no attribute 'group'

(?!)(反向预测):

>>> test = re.match(r'(b(?!abc))','babc')
>>> test.group(1)

Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    test.group(1)
AttributeError: 'NoneType' object has no attribute 'group'
>>> test = re.match(r'(b(?!abc))','bbcd')
>>> test.group(1)
'b'


3.[]系:
[]系列用于范围字符筛选,例子没有必要举,我们只需要明白:

  1. [xyz]表示匹配xyz中的任何一个
  2. [^xyz]表示匹配除了xyz的任何一个
  3. [a-z]表示匹配字符a到字符z之间的任何一个
  4. [^a-z]表示不匹配a-z之间的

2.方法:

Python的re库中提供了许多方法,除了之前提过的match还有search、findall等,并且即使是match方法也有一些比较方便的用法。

1.search方法:
此方法用于匹配一段字符串,有时候我们需要在目标字符串搜索一段字符串,或者找到这段字符串的位置,这时候便可以使用search方法,比如以下的例子:

>>> test = re.search(r'ac','qqqacxxxff')
>>> test.start()
3
>>> test.end()
5

qqqacxxxacffac查找ac的位置,找到这段字符串的首位置为3,结束位置为5。

2.findall方法:
此方法会匹配一个目标字符串中的重复字符串,返回一个数组:

>>> test = re.findall(r'\d+','qqq12xxx45ff90')
>>> test
['12', '45', '90']


3.match方法:
此方法可以活用,当然这种用法也可以用在search等,例子:

>>> test = re.match(r'\S+(?P<d1st>\d+)\S+(?P<d2nd>\d+)\S+(?P<d3rd>\d+)','qqq12xxx45ff90')
>>> test.groupdict()
{'d1st': '2', 'd2nd': '5', 'd3rd': '0'}

返回的是一个字典。
此次教程结束www

如果不是自己的创作,少女是会标识出来的,所以要告诉别人是少女写的哦。