正则表达式(regular expression)是一种用形式化语法描述的文本匹配模式。在需要处理大量文本处理的应用中有广泛的使用,我没使用的编辑器,IDE中的搜索常用正则表达式作为搜索模式。玩过*nix系统的都知道如sed,grep,awk这类的命令,他们是非常强大的文本处理工具。几乎所有的语言都有对正则表达式的支持,有的直接在语法中支持,有的使用扩展库的形式。python使用的就是扩展库re。
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
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\"
import re
pattern = \'ab\'
text = \'abbaaabbbbaaaaaa\'
re.findall(pattern, text) # 返回[\'ab\', \'ab\']
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\"