Python正则表达式之基础篇
正则表达式是用于处理字符串的强大工具它并不是Python的一部分。其他编程语言中也有正则表达式的概念区别只在于不同的编程语言实现支持的语法数量不同。它拥有自己独特的语法以及一个独立的处理引擎在提供了正则表达式的语言里正则表达式的语法都是一样的。下图展示了使用正则表达式进行匹配的流程1.1介绍正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具拥有自己独特的语法以及一个独立的处理引擎效率上可能不如str自带的方法但功能十分强大。得益于这一点在提供了正则表达式的语言里正则表达式的语法都是一样的区别只在于不同的编程语言实现支持的语法数量不同但不用担心不被支持的语法通常是不常用的部分。正则表达式是一个特殊的字符序列它能帮助你方便的检查一个字符串是否与某种模式匹配。Python 自1.5版本起增加了re 模块它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。1.2要知道的各种用法模式字符串使用特殊的语法来表示一个正则表达式字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。多数字母和数字前加一个反斜杠时会拥有不同的含义。标点符号只有被转义时才匹配自身否则它们表示特殊的含义。反斜杠本身需要使用反斜杠转义。由于正则表达式通常都包含反斜杠所以你最好使用原始字符串来表示它们。模式元素(如 r/t等价于//t)匹配相应的特殊字符。下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数某些模式元素的含义会改变。当然这些用法很多待会会给出经常使用到的用法多试试就能理解了。模式模式描述^匹配字符串的开头$匹配字符串的末尾。.匹配任意字符除了换行符当re.DOTALL标记被指定时则可以匹配包括换行符的任意字符。[...]用来表示一组字符,单独列出[amk] 匹配 am或k[^...]不在[]中的字符[^abc] 匹配除了a,b,c之外的字符。re*匹配0个或多个的表达式。re匹配1个或多个的表达式。re?匹配0个或1个由前面的正则表达式定义的片段非贪婪方式re{ n}re{ n,}精确匹配n个前面表达式。re{ n, m}匹配 n 到 m 次由前面的正则表达式定义的片段贪婪方式a| b匹配a或b(re)G匹配括号内的表达式也表示一个组(?imx)正则表达式包含三种可选标志i, m, 或 x 。只影响括号中的区域。(?-imx)正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。(?: re)类似 (...), 但是不表示一个组(?imx: re)在括号中使用i, m, 或 x 可选标志(?-imx: re)在括号中不使用i, m, 或 x 可选标志(?#...)注释.(? re)前向肯定界定符。如果所含正则表达式以 ... 表示在当前位置成功匹配时成功否则失败。但一旦所含表达式已经尝试匹配引擎根本没有提高模式的剩余部分还要尝试界定符的右边。(?! re)前向否定界定符。与肯定界定符相反当所含表达式不能在字符串当前位置匹配时成功(? re)匹配的独立模式省去回溯。\w匹配字母数字\W匹配非字母数字\s匹配任意空白字符等价于 [\t\n\r\f].\S匹配任意非空字符\d匹配任意数字等价于 [0-9].\D匹配任意非数字\A匹配字符串开始\Z匹配字符串结束如果是存在换行只匹配到换行前的结束字符串。c\z匹配字符串结束\G匹配最后匹配完成的位置。\b匹配一个单词边界也就是指单词和空格间的位置。例如 er\b 可以匹配never 中的 er但不能匹配 verb 中的 er。\B匹配非单词边界。er\B 能匹配 verb 中的 er但不能匹配 never 中的 er。\n, \t, 等.匹配一个换行符。匹配一个制表符。等\1...\9匹配第n个分组的子表达式。\10匹配第n个分组的子表达式如果它经匹配。否则指的是八进制字符码的表达式。字符类实例描述[Pp]ython匹配 Python 或 pythonrub[ye]匹配 ruby 或 rube[aeiou]匹配中括号内的任意一个字母[0-9]匹配任何数字。类似于 [0123456789][a-z]匹配任何小写字母[A-Z]匹配任何大写字母[a-zA-Z0-9]匹配任何字母及数字[^aeiou]除了aeiou字母以外的所有字符[^0-9]匹配除了数字外的字符特殊字符类实例描述.匹配除 \n 之外的任何单个字符。要匹配包括 \n 在内的任何字符请使用象 [.\n] 的模式。\d匹配一个数字字符。等价于 [0-9]。\D匹配一个非数字字符。等价于 [^0-9]。\s匹配任何空白字符包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。\w匹配包括下划线的任何单词字符。等价于[A-Za-z0-9_]。\W匹配任何非单词字符。等价于 [^A-Za-z0-9_]。1.3re.match函数re.match 尝试从字符串的起始位置匹配一个模式如果不是起始位置匹配成功的话match()就返回none。re.match(pattern, string, flags 0)pattern 正则表达式string 匹配的字符串flags 标志位用来控制匹配方式下文会讲直接上程序123456importstring,rerabc#正则表达式ifre.match(r,abc):#匹配printdoneelse:printdefeat结果:done可以根据上面各表给出的用法多练练1234567importstring,rera.c#正则表达式 . 匹配任意字符除了换行符当re.DOTALL标记被指定时则可以匹配包括换行符的任意字符。ifre.match(r,abc):printre.match(r,abc)printdoneelse:printdefeat结果_sre.SRE_Match object at 0x01dd6158done注意这里不是显示匹配成功的字符串,re.match() 返回的是一个对象不成功返回的是none. 我们可以通过group(num)或groups()匹配对象函数来获取匹配表达式。