Python 正则表达式之四:re 模块
<p>最最基本的用法就是re.search了,在前面的三篇文章中,我们也已经见过多次,这里就不再赘述了。</p> <h3>re.sub</h3> <p>使用正则表达式进行查找替换,正是re.sub的功能。</p> <p>例如,下面这个例子,将格式化列与之间逗号的用法:</p> <pre> <code class="language-python">>>> row = "column 1,column 2, column 3" >>> re.sub(r',\s*', ',', row) 'column 1,column 2,column 3' </code></pre> <p>下面这个例子更复杂一些,配合正则表达式中的捕获和引用特性,可以方便的转换日期格式:</p> <pre> <code class="language-python">>>> sentence = "from 12/22/1629 to 11/14/1643" >>> re.sub(r'(\d{2})/(\d{2})/(\d{4})', r'\3-\1-\2', sentence) 'from 1629-12-22 to 1643-11-14' </code></pre> <h3>re.split</h3> <p>re.split,算是string.split的正则表达式增强版。</p> <p>例如,对于如下的格式不太规范的逗号分隔的列,就可以用re.split分割出正确的列内容,比用re.findall简洁得多:</p> <pre> <code class="language-python">>>> re.findall(r'([^,]*)(?:,\s*|$)', 'column1, column2,column3') ['column1', 'column2', 'column3', ''] >>> re.split(r',\s*', 'column1, column2,column3') ['column1', 'column2', 'column3'] </code></pre> <h3>re.compile</h3> <p>如果一个正则表达式会被多次用到,那么最好使用re.compile预先创建好一个正则对象,这样执行效率更高。</p> <pre> <code class="language-python">>>> COMMA_RE = re.compile(r',\s*') >>> COMMA_RE.split('column1, column2,column3') ['column1', 'column2', 'column3'] </code></pre> <h3>re.IGNORECASE和re.VERBOSE</h3> <p>re.IGNORECASE很简单,就是在匹配的过程中忽略大小写,就不单独举例了。</p> <p>re.VERBOSE主要解决的是复杂的正则表达式可读性差的问题。使用re.VERBOSE之后,正则表达式字符串中可以使用空格、换行等空白字符隔开各个子部分,增强可读性。例如,如下的正则表达式,匹配了一个uuid字符串:</p> <pre> <code class="language-python">def is_valid_uuid(uuid): hex_re = r'[ a-f \d ]' uuid_re = r''' ^ # beginning of string {hex} 8 # 8 hexadecimal digits - # dash character {hex} 4 # 4 hexadecimal digits - # dash character {hex} 4 # 4 hexadecimal digits - # dash character {hex} 4 # 4 hexadecimal digits - # dash character {hex} 12 # 12 hexadecimal digits $ # end of string '''.format(hex=hex_re) uuid_regex = (uuid_re) return bool(re.search(uuid_regex, uuid, re.IGNORECASE | re.VERBOSE)) </code></pre> <p>这里用{ {8} }是因为format函数中对于{}有特殊含义(占位符),所以这需要转义一次。</p> <p>至此,对Python正则表达式的介绍就告一段落了。更多的细节,当然首推Python的官方文档。</p> <p>在使用正则表达式的过程中,经常会出现当时写的爽,过后再看就犯迷糊的情况,这罪魁祸首就是可读性差。虽然借助re.VERBOSE和注释,可以部分缓解这一问题,但是依然不够理想。</p> <p>前一段时间阅读skynet源码,发现云风在解析skynet config文件时,用到了一个叫lpeg的lua库来进行字符串的模式匹配。lpeg相比于裸正则表达式的优点在于,它可以将一个复杂的模式切分成若干个子部分,并且分别对其命名,然后像拼接字符串一样对各个子模块进行组合,可读性很好。当然,已经有前辈帮我们将其移植到了Python中,有兴趣的读者可以点击 <a href="/misc/goto?guid=4959740645129408180" rel="nofollow,noindex">这里</a> 玩玩。</p> <p> </p> <p> </p> <p>来自:http://blog.guoyb.com/2017/03/06/python-regex-4/</p> <p> </p>
本文由用户 kdpz2605 自行上传分享,仅供网友学习交流。所有权归原作者,若您的权利被侵害,请联系管理员。
转载本站原创文章,请注明出处,并保留原始链接、图片水印。
本站是一个以用户分享为主的开源技术平台,欢迎各类分享!