1.正则表达式的概述
- 通过正则表达式可以定义一些匹配规则,只要满足匹配规则即认为匹配成功,从而实现模糊匹配。
- 正则表达式中既可以包含普通字符,也可以包含由特殊字符指定的匹配模式。
- 在实际应用正则表达式进行匹配时,正则表达式中的普通字符需要做精确匹配,而特殊字符指定的匹配模式则对应了用于模糊匹配的规则。
2.部分匹配模式
|
|
匹配模式 |
描述 |
* |
匹配前一个模式0次或多次。例如,对于正则表达式“a[0-9]*c”,其与“ac”、“a0c”和“a01c”匹配,但与“abc”不匹配 |
+ |
匹配前一个模式1次或多次。例如,对于正则表达式“a[0-9]+c”,其与“a0c”和“a01c”匹配,但与“ac”和“abc”不匹配 |
? |
匹配前一个模式0次或1次。例如,对于正则表达式“a[0-9]?c”,其与“ac”和“a0c”匹配,但与“a01c”和“abc”不匹配 |
{m} |
匹配前一个模式m次。例如,对于正则表达式“a[0-9]{1}c”(表示:a和c之间只有一个数字符),其与“a0c”匹配,但与“ac”、“a01c”和“abc”不匹配 |
{m,n} |
匹配前一个模式m至n次;省略n则匹配前一个模式m次至无限次。例如,对于正则表达式“a[0-9]{1,2}c”(表示:a和c之间有一个数字符或有两个数字符),其与“a0c”和“a01c”匹配,但与“ac”和“abc”不匹配 |
| |
“A|B”表示匹配A或B中的任一模式即可。例如,对于正则表达式“a[b|d]c”,其与“abc”和“adc”匹配,但与“ac”、“aac”和“abbc”不匹配。 |
(…) |
用()括起来的内容表示一个分组。在匹配完成后,可以获取每个分组在字符串中匹配到的内容。例如,对于正则表达式“(.*?)abc”,其与“123abc456abc”匹配结果为“123”和“456”;而对于正则表达式“(.*)abc”,其与“123abc456abc”匹配结果为“123abc456”。“*?”与“*”的区别在于:“*? ”每次匹配尽可能少的字符;而“*”每次会匹配尽可能多的字符 |
\ |
转义符,使后面一个字符改变原来的含义。例如,在正则表达式中要精确匹配字符$,则需要写成“ \$”;要精确匹配字符 ^,则需要写成 \^ ” |
|
|
2.特殊序列
- 正则表达式中还提供了特殊序列以表示特殊的含义,其由“\”和一个字符
组成。
“\”后面的字符可以是数字,也可以是部分英文字母。
- 对于下面\b的非单词字符的解释如下:
单词字符包括:英文,字母,汉字,数字,下划线
另一个是空字符(即字符串的开头或末尾)意思是:字符串的开头是前一个空字符,字符串的末尾后一个是空字符
eg:
“\bfoo\b”:表示的意思是:前一个\b的左边应该是一个非单词字符;后一个\b的右边应该是一个非单词字符;
为啥"foo"可以被匹配呢?
因为:
f的左边是空,是一个非单词字符;
o的右边是空,是一个非单词字符;
中间不用管
|
|
特殊序列 |
描述 |
\number |
number表示一个数字,\number用于引用同一编号的分组中的模式(分组编号从1开始)。例如,对于正则表达式“([0-9])abc\1”,其中的“\1”就表示引用第1个分组中的模式“[0-9] ”,即等价于“([0-9])abc[0-9] ”,匹配以一个数字开头、一个数字结尾、中间是abc的字符串 |
\A |
匹配字符串开头的若干字符,同匹配模式中的^ |
\b |
单词边界符,即\b两边的字符应该一个是非单词字符、另一个是单词字符,或者一个是单词字符、另一个是空字符(即字符串的开头或末尾)。例如,对于正则表达式“\bfoo\b”,其与“foo”、“foo. ”、“(foo) ”和“bar foo baz”匹配,但与“foobar”、“foo3”和“foo_bar”不匹配 |
\B |
非单词边界符,与\b功能相反 |
\d |
匹配任一数字字符,等价于[0-9] |
\D |
与\d作用相反,匹配任一非数字字符,等价于[^0-9] |
\s |
匹配任一空白字符 |
\S |
与\s作用相反,匹配任一非空白字符 |
\w |
匹配包含数字和下划线在内的任一可能出现在单词中的字符 |
\W |
与\w作用相反,即匹配\w不匹配的那些特殊字符 |
\Z |
匹配字符串末尾的若干字符,同匹配模式中的$ |
|
|
- 由于Python的字符串中使用“\”作为转义符,如果要在字符串中使用字符“\”,则需要写作“\”
因此,当进行“\bfoo\b”的匹配时,实际编写代码时要写作'\\bfoo\\b',这样会造成代码编写时容易出错且代码可读性较差。
我们通常在用于表示正则表达式的字符串前加上一个字符r,使得后面的字符串忽略转义符。
例如,对于字符串'\\bfoo\\b',我们可以写作r'\bfoo\b'。