正则表达式

1. 正则表达式是用来匹配字符串的,使用模块re进行匹配;

2. 特殊字符:

  • . 任意字符(除了换行都包括)
  • * 任意次数,+任意≥1次数,{2}出现2次,{2,}出现≥2次,{2,5}出现2-5次
  • ^a 以a开头
  • $a 以a结尾
  • [A-Za-z0-9_]限定范围,[^]限定不是
  • \s 空格,\S不是空格,\w任意字符,\W不是字符(空格)
  • \d 数字
  • | 或者,取并集

3.分组

使用()进行分组,再运用.group()方法捕获分组;

import re  
line='11/27/2012'
datapat=re.compile(r'(\d+)/(\d+)/(\d+)')
m=datapat.match(line)
print(m.groups())
( '11', '27', '2012')
print(m.group(0))
'11/27/2012'
print(m.group(1))
'11'

4. re模块的重要函数方法

.compile():预编译;

.match():用于判断是否匹配成功,如果匹配成功,则返回一个match对象;否则返回None;

import re
line='Today is 11/27/2012. Pycon starts 3/13/2013.'
datapat=re.compile(r'.*(\d+)/(\d+)/(\d+)')
m=datapat.match(line)
print(m.groups())
('3', '13', '2013') %%贪婪匹配的结果

re.match(r'正则表达式',test);或者datapat.match(test);datapat是预编译好的正则表达式。

.findall():用于查找任意部分的模式出现位置;

使用Python的r前缀可以不用考虑\转义的问题;

5.贪婪匹配

python默认的匹配方式是最长的可能匹配;要获得非贪婪匹配时需要用到特殊字符?

import re
line='Today is 11/27/2012. Pycon starts 3/13/2013.'
datapat=re.compile(r'.*?(\d+)/(\d+)/(\d+)')
m=datapat.match(line)
print(m.groups())   ('11', '27', '2012')
datapat=re.compile(r'.*(\d+)/(\d+)/(\d+)')
m=datapat.match(line)
print(m.groups())   ('3', '13', '2013') 

如果你将点(.)号放在开始与结束符(比如引号)之间的时候,那么匹配操作会查找符合模式的最长可能匹配。 这样通常会导致很多中间的被开始与结束符包含的文本被忽略掉,并最终被包含在匹配结果字符串中返回。通过在*或者+这样的不确定性限制符之后加?可以强制将算法改成寻找最短可能匹配,即非贪婪算法。

参考资料:

1. http://python3-cookbook.readthedocs.io/zh_CN/latest/c02/p07_specify_regexp_for_shortest_match.html

2. https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143193331387014ccd1040c814dee8b2164bb4f064cff000

 

 

  

 

posted @ 2018-01-26 15:36  小虾饺  阅读(164)  评论(0)    收藏  举报