正则表达式<一>

  最近在看js,看到表单验证,里面正好有一项是邮箱的验证。书中提到了可以大幅度提高效率和减少代码的正则匹配的方法,突然想到前段时间写爬虫用到的python中的正则表达式,两者相关性甚大。前面写的时候也没有整理过关于正则的一些学习笔记,这次正好又碰上,借此机会复习整理一番。
  文中的大部分内容是参看的AstralWind,巨人的肩膀还是要站的。谢谢他的整理和分享。

基础知识

  正则表达式并不是Python所专有的,正如上面我提到的,js里也有其应用。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。所以如果已经在其他语言里使用过正则表达式,或者了解过正则表达式的基础知识,只需要简单看一看就可以快速上手了。
  正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。如果表达式中有量词或边界,这个过程会稍微有一些不同,但也是很好理解的。下面是匹配过程的示意图:
            贴图1

Python支持的正则表达式元字符和语法

  下面的图片较为完整的展示了正则表达式的语法。
贴图2

几点说明

1.匹配的贪婪与非贪婪模式
  Python里的匹配模式默认是贪婪的(在少数语言里也可能是默认非贪婪)。贪婪的意思就是:总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。如何来控制呢?方法就是使用“非贪婪”操作符?,其可以使用在"*","+","?"后面来终止贪婪模式。举例来说:正则表达式ab*如果用于查找abbbc,将找到abbb。而如果使用非贪婪的数量词ab*?,将找到a

2.符号的转义
  与大多数编程语言相同,正则表达式里使用\作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符“\”,那么使用编程语言表示的正则表达式里将需要4个反斜杠\\\\:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的raw字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了raw字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

3.匹配模式
  正则表达式提供了一些简单实用的匹配模式,比如忽略大小写、多行匹配等,这部分内容将在后续一起介绍。
  
版权:本文采用以下协议进行授权,自由转载 - 非商用 - 非衍生 - 保持署名 | Creative Commons BY-NC-ND 3.0,转载请注明作者及出处。