正则表达式(regular expression)是一种用情势化语法形貌的文本婚配情势。在须要处置惩罚大批文本处置惩罚的运用中有普遍的运用,我没运用的编辑器,IDE中的搜刮经常使用正则表达式作为搜刮情势。玩过*nix体系的都晓得如sed,grep,awk这类的敕令,他们是异常壮大的文本处置惩罚东西。险些一切的言语都有对正则表达式的支撑,有的直接在语法中支撑,有的运用扩大库的情势。python运用的就是扩大库re。
- 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,在’,’以后不能有空格,不然会失足,而且均为闭区间。
{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"