正则表达式 and re 模块

发布时间 2023-10-15 17:49:55作者: 我是大变态

元字符:

^  $  []  {}  ()  .  \  ?  *  +
^ 只能放在正则表达式的前方,且也只能从目标字符串的首部开始匹配
$ 只能放在正则表达式的后方,且也只能从目标字符串的尾部开始匹配
[] 字符集
{} 匹配字符的长度范围,为一个闭区间
() 其中字符串代表一个整体
. 通配符,可以代表任意一个字符,除‘\n’
\ 转义符,将有意义的字符变得没有意义,反之有意义
* *前方的匹配字符的个数[0,+∞)
+ +前方的匹配字符的个数[1,+∞)
? ?前方的匹配字符的个数[0,1]

[] 字符集

字符集中的元字符没有任何特殊意义,就是普通字符,但'\'和'^'字符和'-'在其中有着特殊意义

\  转义符

\w 代表任何字母和数字
\W 代表任何非字母、数字
\s 代表任何空白,\n、\t、\r、\f、\v
\S 代表任何非空白
\d 代表任何数字
\D 代表任何非数字
\b 代表特殊符号,'空白'、'#'、''
\ \本身代表着转义,可以让有意义的符号变得没意义,例如\\b,此时第二个\就变成了普通字符,当前正则表达式匹配的字符内容是\b

^  非符号

在[]中表示不包括后面的内容

-  范围符号

用法如a-z(表示a到z之间包括a、z的所有字母)、a-b、A-Z、0-9

{}  匹配长度

re.findall(r'abc{0}','abccbaabc')
# re.findall()为re的一个方法,用法是将匹配到的字符串分组
# 这里表示c最小匹配长度为0
# 结果为['ab','ab']

re.findall(r'abc{2}','abccbaabc')
# 结果为['abc']

re.findall(r'abc{0,2}','abccbaabc')
# 0为最小长度,2为最大长度
# 结果为['abcc', 'abc']

 对于单独用的()和[]的个人见解(以下说法全部基于单独用的情况下,如r = r"(abc)*")

()中的字符将作为一个整体,不再为一个个体,这一点很重要!

re.findall(r'(abc)*','abcabcabc')
# 通常我们认为的结果是['abcabcabc']
# 但实则是['abc','']
re.findall(r'(abc)*','abc abc abc')
# ['abc', '', 'abc', '', 'abc', '']
# 我觉得是因为(abc)是一个整体了,导致匹配后abc完整字符后,这让程序认为已经找到了目标字符串从而会直接跳出循环,然后进行下一个组的匹配
# 我们想要正常匹配应该用[abc],字符集的表示让程序认为目标字符不在局限性为abc这个整体,后面可能还有更多的字符
re.findall(r'[abc]*','abcabcabc')
# 结果['abcabcabc',''],缺点就是这样能找到abccbacb这样的字符,[]的用法更像集合一样,用a,b,c,ac,ab,ac,abc这些子集去匹配字符