【Python】正则表达式进阶
世界Skill
很久之前写过一篇正则表达式入门,仅仅说明了正则的一些基础用法,实质上正则还有许多更加实用的方法,比如查找方法、结果格式化等等,能够帮助我们更加高效地完成字符串的处理,这也是多次尝试之后的经验之谈。
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.[]系:
[]系列用于范围字符筛选,例子没有必要举,我们只需要明白:
- [xyz]表示匹配xyz中的任何一个
- [^xyz]表示匹配除了xyz的任何一个
- [a-z]表示匹配字符a到字符z之间的任何一个
- [^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