1.常见正则表达式符号
表示法 | 描述 | 正则表达式示例 |
符号 | ||
literal | 匹配文本字符串的字面值literal | foo |
re1|re2 | 匹配正则表达式re1或者re2 | foo|bar |
. | 匹配任何字符(除了\n之外) | b.b |
^ | 匹配字符串起始部分 | ^Dear |
$ | 匹配字符串终止部分 | /bin/*sh$ |
* | 匹配0次或者多次前面出现的正则表达式 | [A-Za-z0-9]* |
+ | 匹配一次或多次前面出现的正则表达式 | [a-z]+\.com |
? | 匹配0次或者1次前面出现的正则表达式 | goo? |
{N} | 匹配N次前面出现的正则表达式 | [0-9]{N} |
{M,N} | 匹配M-N次前面出现的正则表达式 | [0-9]{M-N} |
[…] | 匹配来自字符集的任意单个字符 | [aeiou] |
[..x-y..] | 匹配x-y范围内的任意单个字符 | [0-9],[A-Za-z0-9] |
[^…] | 不匹配此字符集中出现的任何一个字符,包括某一范围的字符 | [^aeiou] |
(*|+|?|{})? | 用于匹配上面频繁出现/重复出现符号的非贪婪版本(*、+、?、{}) | .*?[a-z] |
(…) | 匹配封闭的正则表达式,然后另存为子组 | ([0-9]{3})?,f(oo|u)bar |
2.常见正则表达式特殊字符
表示法 | 描述 | 正则表达式示例 |
特殊字符 | ||
\d | 匹配任何十进制数字,与【0-9】一致(\D与\d相反,不匹配任何非数值型的数字) | data\d+.txt |
\w | 匹配任何字母数字字符,与【A-Za-z0-9】相同(与\W相反) | 【A-Za-z_】\w+ |
\s | 匹配任何空格字符,与[\n\t\r\v\f]相同(\S与之相反) | of\sthe |
\b | 匹配任何单词边界(\B与之相反) | \bThe\b |
\N | 匹配已经保存的子组N | price:\16 |
\c | 逐字匹配任何特殊字符c(即,仅按照字母意义匹配,不匹配特殊含义) | \., \\, \* |
\A(\Z) | 匹配字符串的起始(结束) | \ADear |
3.练习
3.1使用择一匹配符号匹配多个正则表达式模式
表示择一匹配的管道符号(|),也就是键盘上的竖线,表示一个“从多个模式中选择其一”的操作。它用于分割不同的正则表达式。例如,在下面的表格中,左边是一些运用择一匹配的模式,右边是左边相应的模式所能够匹配的字符。
正则表达式模式 | 匹配的字符串 |
at|home | at,home |
r2d2|c3po | r2d2,c3po |
bat|bet|bit | bat,bet,bit |
有了这个符号,就能够增强正则表达式的灵活性,使得正则表达式能够匹配多个字符串而不仅仅只是一个字符串。择一匹配有时候也称作并(union)或者逻辑或(logical or)
3.2匹配任意单个字符
点好或者句号(.)符号匹配除了换行符\n以外的任何字符(python正则表达式有一个编译标记【S或者DOTALL】,该标记能够推翻这个限制,使点号能够匹配换行符)。无论字母、数字、空格(并不包括“\n”换行符)、可打印字符、不可打印字符,还是一个符号,使用点号都能够匹配它们。
正则表达式模式 | 匹配的字符串 |
f.o | 匹配在字母“f”和“o”之间的任意一个字符,例如fao、f9o、f#o等 |
.. | 匹配任意2个字符 |
.end | 匹配在字符串end之前的任意一个字符 |
ps:怎样才能匹配句号点(dot)或者句号(period)字符。
ps:要显式匹配一个句号点符号本身,必须使用反斜线转义句点符号的功能,例如“\.”
3.3从字符串起始或者结尾或者单词边界匹配
还有些符号和相关的特殊字符用于在字符串的起始和结尾部分指定用于搜索的模式。如果要匹配字符串的开始位置,就必须使用脱字符(^)或者特殊字符\A(反斜线和大写字母A)。后者主要用于那些没有脱字符的键盘(如某些国际键盘)。同样,美元符号($)或者\Z将用于匹配字符串的末尾位置。
使用这些符号的模式与本章描述的其他大多数模式是不同的,因为这些模式指定了位置或者方位。之前的“核心提示”记录了匹配(试图在字符串的开始位置进行匹配)和搜索(试图从字符串的任何位置开始匹配)之间的差别。正因为如此,下面是一些表示“边界绑定”的正则表达式搜索模式的示例。
正则表达式模式 | 匹配的字符串 |
^From | 任何以From作为起始的字符串 |
/bin/tcsh$ | 任何以/bin/tcsh作为结尾的字符串 |
^Subject:hi$ | 任何由单独的字符串Subject:hi构成的字符串 |
再次说明,如果想要逐字匹配这些字符中的任何一个(或者全部),就必须使用反斜线进行转义。例如,如果你想要匹配任何以美元符号结尾的字符串,一个可行的正则表达式方案就是使用模式.*\$$。
特殊的字符\b和\B可以用来匹配字符边界。而两者的区别在于\b将用于匹配一个单词的边界,这意味着如果一个模式必须位于单词的起始部分,就不管该单词前面(单词位于字符串中间)是否有任何字符(单词位于行首)。同样,\B将匹配出现在一个单词中间的模式(即,部署单词边界)。下面是一些是咧。
正则表达式模式 | 匹配的字符串 |
the | 任何包含the的字符串 |
\bthe | 任何以the开始的字符串 |
\bthe\b | 仅仅匹配单词the |
\Bthe | 任何包含但并不以the作为起始的字符串 |
3.4创建字符集
尽管句点可以用于匹配任意符号,但某些时候,可能想要匹配某些特定字符。正因为如此,发明了方括号。该正则表达式能够匹配一对方括号中包含的任何字符。下面为一些示例。
正则表达式模式 | 匹配的字符串 |
b[aeiu]t | bat,bet,bit,but |
[cr][23][dp][o2] | 一个包含四个字符的字符串,第一个字符是c或者r, 然后是2或者3,后面是d或者p,最后要么是o或者2. |
关于[cr][23][dp][o2]这个正则表达式有一点需要说明:如果仅允许 “r2d2” 或者 “c3po”
作为有效字符串,就需要更严格限定的正则表达式。因为方括号仅仅表示逻辑或的功能,所以使用方括号并不能实现这一限定要求。唯一的方案就是使用择一匹配,例如,r2d2|c3po。
然而,对于单个字符的正则表达式,使用择一匹配和字符集是等效的。例如,我们以正则表达式“ab”作为开始,该正则表达式只匹配包含字母“a”且后面跟着字母“b”的字符串,如果我们想要匹配一个字母的字符串,例如,要么匹配“a”,要么匹配“b”,就可以使用正则表达式[ab],因为此时字母“a”和字母“b”是相互独立的字符串。我们也可以选择正则表达式 a|b。然而,如果我们想要匹配满足模式“ab”后面且跟着“cd”的字符串,我们就不能使用方括号,因为字符集的方法只适用于单字符的情况。这种情况下,唯一的方法就是使用 ab|cd,这与刚才提到的 r2d2/c3po 问题是相同的。