Basic RE in python3
正则可以串联,换句话说:如果A和B都是正则表达式的话,则AB也是一个正则表达式。通常如果一个字符串P匹配上表达式A,字符串Q匹配表达式B则字符串PQ将会匹配表达式AB。但是如果表达式中包含低优先级的操作符,AB之间有边界条件或者是拥有几个组的关联,上面的结论不成立。因此一个复杂表达式可以由几个简单的原始表达式组合而成。关于正则表达式的细节和理论可以参考Friedl book。
下面是简单的正则表达式格式的介绍,需要了解更进一步的信息和优雅的表现方式可以查阅:Regular Expression HOWTO。
正则表达式可以包含普通和特殊的字符。大多数普通字符像’A’,‘b’等就是一个最简单的正则表达式。它们仅仅匹配它们本身。所以表达式’last’仅仅匹配字符串’last’。
一些字符像’|’,’)'等,则是特殊字符。特殊字符可以表示普通字符集合或者影响它们周围的正则表达式被如何解析。
像(*
,+
,?
,{m,n}
, etc)这些重复限定符是无法被直接关联。这避免了与贪婪性模式修正符后缀’?‘和在其它实现终端其它模式修正符的歧义。在内部重复中使用第二次重复,必须使用大花括号。举个例子表达式’(?:a{6})*'匹配任意数量的’6a’字符串。
有以下提示字符:
特殊字符 | 含义 |
---|---|
. | 点,在默认模式中,可匹配除新行意外的任何字符。如果DOTALL 被指定了,则匹配包括新行的所有字符。 |
^ | 脱字符号(caret),匹配字符串的开头。在MULTILINE (多行模式)中匹配每行的开头。 |
$ | 美元符号,匹配字符串的末尾或者在字符串多行之前。在MULTILINE (多行模式)中同样匹配到空行之前。 |
* | 匹配 ‘*’ 号前面的字符串的0个或者多个重复 |
+ | 匹配 + 号前面字符串的一个或者多个重复 |
? | 匹配 ? 号前面字符串的一个或者0个重复。* , ? + 都是贪婪(greedy)的限定符,他们匹配尽可能多的文本。有时不会匹配到想要的结果。举个例子:表达式 <.*> 会匹配到 <a>b<c> 而不是 <a>。在后面添加 ? 后开始匹配会匹配尽可能少的字符串。如 <.*?> 只会匹配 <a>。 |
{m} | 会匹配 {}号前面至少m个重复,如 a{m} 不会匹配 aaaa 这个字符串。 |
{m, n} | a{m,n} 匹配m个到n个m, 省略任何一端都会趋向各自的上限。 |
{m, n}? | a{m,n}? 匹配s个a s在 [m, n]之间。 |
\ | 转义字符允许你匹配特殊字符或者表示一个特殊顺序 |
[] | 用来表示一组字符。常见用法[abc]表示 a b c ; 使用 - 号可以表示范文芳, 如 [a-z]匹配小写英文字母; []里特殊字符会失去其特殊的意义; 字符组(Character classes)如 \w和 \s都可以在[]中使用,但是它们匹配的字符串由ASCII orLOCALE 的是否强制使用决定;通过使用互补数组(_complementing_the set)可以匹配不在范围中的字符串,脱字字符在[]中的开头有提示意义如 [^5]匹配除5之外所有字符; 匹配 ] 可以用 \ 转义或者将其置于 [] 一开始 |
| | A|B A和B是任意的正则表达式。表达式匹配A或者B。 或者 A|B|C 只要满足A则不再判断B C。 |
(…) | 匹配括号中的所有正则表达式。并且表示一个组的开始和结束。 |
(?..) | |
\ | |
\number | 匹配组号为number的组的内容。组号以一为开始。 |
\A | 匹配字符串的开头 |
\b | 匹配字符串的开头或者结尾的空字符串 |
\B | 与 \b 相反 |
\d | 对于 Unicode(str)匹配任何 Unicode的十进制数, 对于8位模式来说,匹配任何[0-9]的任何数 |
\s | 匹配Unicode(str) [\t\n\r\f\v] |
\S | 匹配任何不是空格的字符和 \s 相反。如果使用了 ASCII 就等效于[^\t\n\r\f\v] |
\w | 匹配所有的语言能够使用的字符,如果使用了ASCII 则只能匹配[a-zA-Z0-9_] |
\W | 匹配所有不是语言文字的字符,如果使用了ASCII 则匹配[^a-zA-Z0-9_] 。 |
\Z | 匹配字符串的末尾 |