正则表达式通俗理解(浅浅分享一下正则表达式)
正则表达式通俗理解(浅浅分享一下正则表达式).结果字符字符含义实例abc
正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。
使用正则表达式之前一定要先导入re模块(import re)
有一点需要特别注意的是,正则表达式使用 对特殊字符进行转义,所以如果我们要使用原始字符串,只需加一个 r 前缀,如r'a.c'。
1.正则表达式的匹配规则可在网站里一个一个试一试,测试网站为https://regex101.com/
字符 |
字符含义 |
实例abc |
结果 |
. |
匹配任意字符,换行符“\n”除外 |
a.c |
abc |
\ |
转义字符,使后一个字符改变原来的意思 |
a\.c |
None |
[...] |
字符集(字符类),对应的位置可以是字符集中的任意字符,字符集中的字符集可逐个列出,也可以给出范围,如[abc]或[a-c] |
a[b-z]c |
abc |
预定字符集:实例abc1314520
\d |
匹配数字:[0-9] |
(\d) |
1314520 |
\D |
匹配非数字:[^\d] |
(\D) |
abc |
\s |
匹配空白字符:[<空格>、\t\r\n\f\v] |
(\s) |
None |
\S |
匹配非空白字符 |
(\S) |
abc1314520 |
\w |
单词字符:[a-zA-Z0-9] |
(\w) |
abc1314520 |
\W |
非单词字符 |
(\W) |
None |
数量词(用在字符或(...)之后):实例aabc
* |
匹配前一个字符0或无限次 |
a*b |
aab |
|
匹配前一个字符1或无限次 |
a b |
aab |
? |
匹配前一个字符0或1次 |
a?c |
c |
{m} |
匹配前一个字符m次 |
a{2} |
aa |
{m n} |
匹配前一个字符m到n次,若m缺省,则匹配0到n次,若n缺省 则匹配m到无限次 |
a{1 3} |
aa |
边界匹配(不消耗待匹配字符串中的字符)
^ |
①匹配字符串开头 |
| |
"|"代表左右表达式任意匹配一个,相当于“或”。它总是先尝试匹配左边的表达式,一旦成功则跳过匹配右边的表达式,若“|”没有被包括在()中,则它的整个范围是整个正则表达式 |
(...) |
被括起来的表达式作为一个整体,从表达式左边开始每遇到一个分组的左括号“(”,编号 1 |
(?P<name>...) |
分组,除了原有的编号外再指定一个额外的别名,如(?P<id>abc) |
\<number> |
引用编号为<number>的分组匹配到的字符串,如abc\1 |
(?P=name) |
引用别名为<name>的分组匹配到的字符串,如(?P=id) |
* ? {m} {m } {m n}这六种匹配符号默认都是贪婪匹配的,即会尽可能多地匹配符合条件的内容。
结果:bcbc
非贪婪匹配很简单,就是在上述六种贪婪匹配符号后面加上问号?,即*? ? ?? {m}? {m }? {m n}?。
结果bc
各种方法match、search、findall、finditer、sub方法,match\search的结果可用“.group”成组打印。
match |
查找字符串的头部(也可以指定起始位置),它是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果。它的一般使用形式如下: match(string[ pos[ endpos]]) |
search |
查找字符串的任何位置,它也是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果,它的一般使用形式如下: search(string[ pos[ endpos]]) |
findall |
findall 以列表形式返回全部能匹配的子串,如果没有匹配,则返回一个空列表 findall 方法的使用形式如下: findall(string[ pos[ endpos]]) |
finditer |
finditer 方法的行为跟 findall 的行为类似,也是搜索整个字符串,获得所有匹配的结果。但它返回一个顺序访问每一个匹配结果(Match 对象)的迭代器。 |
sub |
sub 方法用于替换。它的使用形式如下: sub(repl string[ count]) |
以match方法为例:
import re
test='abc12345'
a=re.match(r"abc" test)
print(a)
print(a.group())
结果:
<re.Match object; span=(0 3) match='abc'>
abc