你并不熟悉的 Python 正则高级用法

BookerGibbo 8年前
   <p>学习正则的第一个教程应该去看<正则表达式30分钟入门教程>(http://deerchao.net/tutorials/regex/regex.htm), 学会里面的内容就足够满足大部分的工作需要了。而对于Python来说,就要学习模块re的使用方法。文本将展示一些大家都应该掌握的高级技巧。</p>    <h2>编译正则对象</h2>    <p>re.compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。用法上略有区别,举个例子, 匹配一个字符串可用如下方式:</p>    <p>如果使用compile,将变成:</p>    <p>为什么要这么用呢?其实就是为了提高正则匹配的速度,重复利用正则表达式对象。我们对比一下2种方式的效率:</p>    <p><img src="https://simg.open-open.com/show/b3d79655c97e295b64cd7e015653acd9.jpg"></p>    <p>可以看到第二种方式要快很多。在实际的工作中你会发现越多的使用编译好的正则表达式对象,效果就越好。</p>    <p>分组(group)</p>    <p>你可能已经见过对匹配的内容进行分组的用法了:</p>    <p><img src="https://simg.open-open.com/show/abb26e9050a0bda6c23350a7041e6b56.jpg"></p>    <p>通过对要匹配的对象添加括号,就可以精确的对应符合的结果了。我们还可以进行嵌套的分组:</p>    <p><img src="https://simg.open-open.com/show/f5cd5409a290848d847290bceeb45e24.jpg"></p>    <p>分组可以满足需求,但是有时候可读性很差,那可以对分组进行命名:</p>    <p><img src="https://simg.open-open.com/show/43f2f4921ed010b89d986c7d253fd78a.jpg"></p>    <p>现在可读性就非常高了。</p>    <h2>字符串匹配</h2>    <p>学过sed的同学可能见过如下替换用法:</p>    <p>这个\1表示前面正则匹配到的结果。上面的sed也就是给匹配到的结果加上中括号。</p>    <p>在re模块中也存在这样的用法:</p>    <p><img src="https://simg.open-open.com/show/88fdef047f5b276bb1228dcb479ea786.jpg"></p>    <p>用命名分组也是可以的:</p>    <p><img src="https://simg.open-open.com/show/8b8db826fd485b8b3f11d9333515255c.jpg"></p>    <p>附近匹配(Look around)</p>    <p>re模块也支持附近匹配,看看例子就懂了:</p>    <p><img src="https://simg.open-open.com/show/3b260905c0b6d87476155cb0f8eb31f9.jpg"></p>    <p>正则匹配的时候使用函数</p>    <p>之前我们看到的大部分内容都是匹配的是一个表达式,但是有时候需求要复杂得多,尤其是在替换的时候。</p>    <p>举个例子,通过Slack的API能获取聊天记录,比如下面这句:</p>    <p>其中<@U1EAT8MG9>和<@U0K1MF23Z>是2个真实的用户,但是被Slack封装了,需要通过其他接口获取这个对应关系,</p>    <p>其结果类似这样:</p>    <p>在解析对应关系之后,还希望吧尖括号也去掉,替换后的结果是「@xiaoming, @laolin 嗯 确实是这样的 」</p>    <p>用正则怎么实现呢?</p>    <p><img src="https://simg.open-open.com/show/d30489708276c70a38ca3104198a998f.jpg"></p>    <p>所以pattern当然也可以是一个函数</p>    <p> </p>    <p> </p>    <p>来自:http://mp.weixin.qq.com/s/6eA4L-l8Wy-pL93lg5uhVg</p>    <p> </p>