Permalink
Browse files

add python-regular-expression.rst

  • Loading branch information...
1 parent 247d0ab commit 38d7a5b3ed4df62a2dc4665be2716be45121faef @youngsterxyf committed Apr 18, 2012
Showing with 113 additions and 0 deletions.
  1. +113 −0 python-regular-expression.rst
@@ -48,3 +48,116 @@ Python自1.5版本起增加了re模块,提供Perl风格的正则表达式模
重复
^^^^^
+
+正则表达式第一件能做的事是能够匹配不定长的字符集,而这是其他能作用在字符串上的方法所做不到的。不过,如果那是正则表达式唯一的附加功能的话,那么它就不那么优秀了。它们的另一个功能就是你可以指定正则表达式的一部分的重复次数。
+
+- * : * 并不匹配"*" ,相反,它指定前一个字符可以被匹配零次或更多次,而不是只有一次。
+
+像 * 这样的重复是"贪婪的";当重复一个RE时,匹配引擎会试着重复尽可能多的次数。如果模式的后面部分没有被匹配,匹配引擎将退回并再次尝试更小的重复。
+
+- + : 表示匹配一次或更多次。请注意 * 和 + 之间的不同。 * 匹配零或更多次,所以可以根本就不出现,而 + 则要求至少出现一次。
+
+- ? : 匹配一次或零次。你可以认为它用于标识某事物是可选的。
+
+- {m,n} : 最复杂的重复限定符,其中m和n是十进制整数。该限定符的意思是至少有m个重复,至多有n个重复。举个例子,a/{1,3}b将匹配"a/b","a//b","a///b"。
+
+你可以忽略m或n;因为会为缺失值假设一个合理的值。忽略m会认为下边界是0,而忽略n的结果将是上边界为无穷大。
+
+{0,}等同于 * ,{1,}等同于+,而{0,1}则与?相同。
+
+使用正则表达式
+---------------
+
+re模块提供了一个正则表达式引擎的接口,可以让你将REs编译成对象并用它们来进行匹配。
+
+编译正则表达式
+^^^^^^^^^^^^^^^^
+
+::
+
+ >>> import re
+ >>> p = re.compile('ab*')
+ >>> p
+ <_sre.SRE_Pattern object at 0x917ef20>
+
+re.compile()也接受可选的标志参数,常用来实现不同的特殊功能和语法变更。
+
+反斜杠的麻烦
+^^^^^^^^^^^^^
+
+为了匹配一个反斜杠,不得不在RE字符串中写'\\\\',因为正则表达式中必须是"\\",而每个反斜杠在常规的Python字符串值中必须表示成"\\"。在REs中反斜杠的这个重复特性会导致大量重复的反斜杠,而且所生成的字符串也很难懂。
+
+解决的办法就是为正则表达式使用Python的raw字符串表示,在字符串前加个"r",反斜杠就不会被任何特殊方式处理。
+
+执行匹配
+^^^^^^^^^^
+
+一旦有了已经编译了的正则表达式对象,就可以使用它的一些方法和属性。
+
+- match() 决定RE是否在字符串刚开始的位置匹配
+
+- search() 扫描字符串,找到这个RE匹配的位置
+
+- findall() 找到RE匹配的所有子串,并把它们作为一个列表返回
+
+- finditer() 找到RE匹配的所有子串,并把它们作为一个迭代器返回
+
+如果没有匹配到的话,match()和search()将返回None。如果成功的话,就返回一个 ``_sre.SRE_Match object`` 实例,其中有这次匹配的信息:它是从哪里开始和结束,它所匹配的子串等等。
+
+模块级函数
+^^^^^^^^^^^^
+
+re模块也提供了顶级函数,如match(),search(),sub()等等。这些函数使用RE字符串作为第一个参数。
+
+::
+
+ >>> print re.findall('\d+', "xiayf 1987 08 22 hello")
+ >>> ['1987', '08', '22']
+
+编译标志
+^^^^^^^^^
+
+编译标志让你可以修改正则表达式的一些运行方式。在re模块中标志可以使用两种名字,一种是全名如IGNORECASE,一种是缩写,一个字母的形式如I。多个标志可以通过按位或|标志来连接。
+
+- DOTALL, S 使.匹配包括换行符在内的所有字符
+
+- IGNORECASE, I 使匹配对大小写不敏感
+
+- LOCALE, L 做本地化识别(locale-aware)匹配
+
+- MULTILINE, M 多行匹配,影响^和$
+
+- VERBOSE, X 能够使用REs的verbose状态
+
+更多模式功能
+--------------
+
+更多的元字符
+^^^^^^^^^^^^^
+
+- | : 如果A和B是正则表达式,A|B将匹配任何匹配了A或B的字符串。
+
+为了匹配字母"|",可以用\|,或将其包含在字符类中,如[|]
+
+- ^ : 匹配行首。除非设置MULTILINE标志,它只是匹配字符串的开始。在MULTILINE模式里,它也可以直接匹配字符串中的每个换行。
+
+例如,如果你只希望匹配在行首单词"From",那么RE将用^From
+
+::
+
+ >>> import re
+ >>> print re.search('^From', 'From Here to Etenity')
+ <_sre.SRE_Match object at 0xa162950>
+ >>> print re.search('^From', 'Reciting from Memory')
+ None
+ >>>
+
+- $ : 匹配行尾,行尾被定义为要么是字符串尾,要么是一个换行符后面的任何位置
+
+- \A : 只匹配字符串首。当不在MULTILINE模式,\A和^实际上是一样的。然而,在MULTILINE模式里它们是不同的:\A只是匹配字符串首,而^还可以匹配在换行符之后字符串的任何位置。
+
+- \Z : 只匹配字符串尾
+
+- \b : 单词边界。这是个零宽界定符。只用于匹配单词的词首和词尾。单词被定义为一个字母数字序列,因此词尾就是用空白符或非字母数字符来标示的。
+
+- \B : 另一个零宽界定符,它正好和\b相反,只在当前位置不在单词边界时匹配。

0 comments on commit 38d7a5b

Please sign in to comment.