本文为笔者自学+复习所用。
在开始之前,了解一些内容:
正则表达式中,字符和字符可以和自己匹配,除了元字符(metacharacter):
. ^ $ + * ? {} [] \ | ()
但是如果我特别想把他们匹配在一起咋办呢?
match() 是从头开始匹配字符串的,如果首字母不匹配,或是匹配中断,就算后面有可以匹配的字符串,也没有用。
请将上面的话重复三遍。
使用正则匹配字符串,是一件挺有意思的事情,类似于从头对比两个字符串,如果出现不一样的就停止,同时将一样的部分赋值给变量。
import re
a = re.match('a', 'abc')
print(a)
# a
b = re.match('aa', 'abc')
print(b)
# None
c = re.match('b', 'abc')
print(c)
# None
发现什么问题了吗?
’a‘ 和 ’abc‘ 从头匹配时,完美匹配,打印输出 a, 类型为 str
’aa‘ 和 ’abc‘ 从头匹配时,第二个a和b不匹配,打印出None
第三个也是如此。
方括号里面放的是要匹配的字符或是字符串,统称字符类。
如果放置的是 [a],表示单独匹配一个 a 且仅匹配一次。
import re
a = re.match('[a]', 'abcd')
print(a)
#
解释一下:
调用match() 表示,我要匹配参数1: '[a]' (注意字符串标志性 '' 的位置)和参数2:'abcd'。
从头比较,如果参数2 中第一个字符是参数1 的字符,保存,继续进行匹配。如果不匹配,直接返回。
而且会发现,其打印出来的内容和字符串不太一样啊?那如何才能只输出一个字符串呢?
【如果只要输出结果,可以输出 a.group(),无需传入参数,但很容易报错,这个目前我还没有弄清楚,容我搞清楚后再解释】
问题:那么开头不是a,会如何?
a = re.match('[a]', 'bbck')
print(a)
# None
因为第一个字母就不匹配,直接返回None
【match内部的构造我并不清楚,其match最初为一个空字符串,用来储存匹配结果,如果匹配结果为None,则输出时直接输出None;如果不为空,则会返回一个“属性”,标注span,相当于“范围”,类似于索引,从0开始,包头不包尾】
问题:方括号里能不能添加多个字符呢?
答:可以。
b = re.match('[abc]', 'ababccck')
print(b)
#
c = re.match('[abc]', 'babccck')
print(c)
#
d = re.match('[abc]', 'cbabccck')
print(c)
#
看出什么门道了吗?
放置多个字符在方括号里,会匹配其中任意一个字符,不重复,直接停止。相当于 [] 里面的所有字符,占一个字符的位置。
那我要想重复输出怎么办?
隆重介绍一下重复类标识:
* 和 +
表示:出现0次,1次,或多次。
a = re.match('[a]*', 'aqbcd')
print(a)
#
b = re.match('a*', 'aaa')
print(a)
#
表示出现多次。
a = re.match('b[a]+', 'baaaaaacd')
print(a)
#
占位,可以匹配任意字符。
a = re.match('b.', 'baaaaaacd')
print(a)
#
a = re.match('b.*', 'baaaaaacd')
print(a)
#
a = re.match('b[.]*', 'baaaaaacd')
print('a', a)
# a
发现:点放在方括号内部就失去了其功能。
^在方括号内部位置不同,所起的作用也不相同。
[^a]:表示与其匹配的字符串中第一个不可为a
[a^]:此时^相当于失去了作用的字符,没有太大用。
e = re.match('[^2]', 'kij2jj')
print(e)
#
e = re.match('[2^]', '2kij2jj')
print('e', e)
# e
e = re.match('[2^]', '2^kij2jj')
print('e', e)
# e
就算不匹配,也没问题,依然可以超常输出。
^在 "" 引号中就不太一样了:
e = re.match('2^', '2^kij2jj')
print('e', e)
# e None
e = re.match('^2', '2^kij2jj')
print('e', e)
# e
e = re.match('^2', '^kij2jj')
print('e', e)
# e None
这是,^在字符串开头表示:匹配的字符串开头必须是^后面的字符。
其他的符号容我慢慢学来。日拱一卒,功不唐捐。