Python RE (一)正则表达式——基于match()

前言:

本文为笔者自学+复习所用。

在开始之前,了解一些内容:

  • RE:regular expression 
  • 正则表达式中,字符和字符可以和自己匹配,除了元字符(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)

# <re.match object; span = (0, 1), match = "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)

# <re.match object; span = (0, 1), match = 'a'>


c = re.match('[abc]', 'babccck')
print(c)

# <re.match object; span = (0, 1), match = 'b'>


d = re.match('[abc]', 'cbabccck')
print(c)

# <re.match object; span = (0, 1), match = 'c'>

看出什么门道了吗?

放置多个字符在方括号里,会匹配其中任意一个字符,不重复,直接停止。相当于 [] 里面的所有字符,占一个字符的位置。

那我要想重复输出怎么办?

隆重介绍一下重复类标识

重复:

* 和 +

星号 * :

表示:出现0次,1次,或多次。

a = re.match('[a]*', 'aqbcd')
print(a)

# <re.Match object; span=(0, 1), match='a'>


b = re.match('a*', 'aaa')
print(a)

# <re.Match object; span=(0, 3), match='aaa'>

加号 +:

表示出现多次。

a = re.match('b[a]+', 'baaaaaacd')
print(a)

# <re.Match object; span=(0, 7), match='baaaaaa'>

占位符:

点 .: 

占位,可以匹配任意字符。

a = re.match('b.', 'baaaaaacd')
print(a)

# <re.Match object; span=(0, 2), match='ba'>


a = re.match('b.*', 'baaaaaacd')
print(a)

# <re.Match object; span=(0, 9), match='baaaaaacd'>


a = re.match('b[.]*', 'baaaaaacd')
print('a', a)

# a <re.Match object; span=(0, 1), match='b'>

 发现:点放在方括号内部就失去了其功能。

补注号 ^:

^在方括号内部位置不同,所起的作用也不相同。

[^a]:表示与其匹配的字符串中第一个不可为a

[a^]:此时^相当于失去了作用的字符,没有太大用。

e = re.match('[^2]', 'kij2jj')
print(e)
# <re.Match object; span=(0, 1), match='k'>


e = re.match('[2^]', '2kij2jj')
print('e', e)
# e <re.Match object; span=(0, 1), match='2'>


e = re.match('[2^]', '2^kij2jj')
print('e', e)
# e <re.Match object; span=(0, 1), match='2'>

就算不匹配,也没问题,依然可以超常输出。

^在 "" 引号中就不太一样了:

e = re.match('2^', '2^kij2jj')
print('e', e)
# e None


e = re.match('^2', '2^kij2jj')
print('e', e)
# e <re.Match object; span=(0, 1), match='2'>


e = re.match('^2', '^kij2jj')
print('e', e)
# e None

这是,^在字符串开头表示:匹配的字符串开头必须是^后面的字符。

其他的符号容我慢慢学来。日拱一卒,功不唐捐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值