Python正则表达式(1)


正则表达式(regular expression)是一种用形式化语法描述的文本匹配模式。在须要处理大量文本处理的应用中有普遍的使用,我没使用的编辑器,IDE中的搜索经常使用正则表达式做为搜索模式。玩过*nix系统的都知道如sed,grep,awk这类的命令,他们是很是强大的文本处理工具。几乎全部的语言都有对正则表达式的支持,有的直接在语法中支持,有的使用扩展库的形式。python使用的就是扩展库re。python

  • re.search(pattern,string,flag=0)
    搜索文本中的匹配的模式是最经常使用的.以模式和文本做为输入,若是有匹配则返回一个Match对象,反之返回None。
    每一个Match对象包括相关的匹配信息:原字符串、正则表达式和匹配的文本在字符串中的位置。
import re  
pattern = "this"  
text = "Does this text match the pattern?"  
match = re.search(pattern, text)  # 返回一个Match对象  
print match.re.pattern  # 要匹配的正则表达式"this"
print match.string      # 匹配的文本"Does this match the pattern?"  
print match.start()     # 匹配的开始位置 5
print match.end()       # 匹配的结束位置 9
  • re.compile(pattern,flag=0)
    若是程序中频繁的使用到同一个正则表达式,每次使用的时候都写一遍正则表达式不只不高效并且会大大增长出错的概率,re提供了compile函数将一个表达式字符串编译为一个RegexObject。
    模块级函数会维护已编译表达式的一个缓存,而这个缓存是的大小是有限制的。直接使用已经编译的表达式能够避免缓存查找的开销,而且在加载模块时就会预编译全部的表达式。
import re  
regex = re.compile("this")  
text = "Does this text match the pattern?"  
match = regex.search(text)  
if match:  
    print "match"  
    match.group(0)    #返回匹配的字符串   
else:
    print "not match"
  • re.findall(pattern, string, flag=0)
    使用search会返回匹配的单个实例,使用findall会返回全部匹配的不重叠的子串。
import re  
pattern = 'ab'  
text = 'abbaaabbbbaaaaaa'  
re.findall(pattern, text)   # 返回['ab', 'ab']
  • re.finditer(pattern, string, flag=0)
    finditer会返回一个迭代器,会生成Match实例,不像findall()返回字符串.
import re  
pattern = 'ab'  
text = 'abbaaabbbbaaaaaa'  
match = re.finditer(pattern, text)   
for m in match:
    print m.start()  
    print m.end()

以上的例子会分别输出两次匹配结果的起始位置和结束位置。正则表达式

正则匹配默认采用的是贪婪算法,也就是说会re在匹配的时候会利用尽量多的输入,而使用?能够关闭这种贪心行为,只匹配最少的输入。这以前先说下量词。算法

量词是为了简化正则表达式的读写而定义的,通用的形式是{m,n},这表示匹配的个数至少是m,最可能是n,在','以后不能有空格,不然会出错,而且均为闭区间。express

{n} 以前的元素必须出现n次
{m,n} 以前元素最少出现m次,最多n次
{m,} 以前的元素最少出现m次,无上限
{0,n} 以前的元素能够不出现,也能够出现,出现的话最多出现n次缓存

除了之上,还有三个经常使用的量词*,?和+编辑器

* 等价于{0,}
+ 等价于{1,}
\? 等价于{0,1}函数

还有^和$,分别表示段或者字符串的开始与结束。工具

import re  
re.search("^travell?er$", "traveler")    # True  
re.search("^travell?er$", "traveller")   # True   
re.search("^ab\*", "abbbbbbb")           # True,返回"abbbbbbb" 
re.search("^ab\*?", "abbbbbbb")          # True,返回"a"  
re.search("^ab+", "abbbbbbb")            # True,返回"abbbbbbb" 
re.search("^ab+?", "abbbbbbb")           # True,返回"ab"