仅供学习,转载请注明出处
匹配多个字符
思考
- 场景:胖子老板在写字板写了一大堆东西,判断是否存在smoke的语句,判断正确就可以送你一包烟。
前面篇章讲到了如何匹配单个字符,但是却不能完美解决胖子老板提出的这个问题。那么当然就要继续增加技能点,来解决这个问题啦。
匹配多个字符的相关格式
字符 | 功能 |
---|---|
* | 匹配前一个字符出现0次或者无限次,即可有可无 |
| 匹配前一个字符出现1次或者无限次,即至少有1次 |
? | 匹配前一个字符出现1次或者0次,即要么有1次,要么没有 |
{m} | 匹配前一个字符出现m次 |
{m,n} | 匹配前一个字符出现从m到n次 |
匹配前一个字符出现0次或者无限次,即可有可无: *
代码语言:javascript复制# 首先匹配一个单字符大写M来热热身
In [8]: re.match("M","M").group()
Out[8]: 'M'
# 当小写m来匹配大写M字符的时候,淡定报错
In [9]: re.match("m","M").group()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-9-a22cd8e2da84> in <module>
----> 1 re.match("m","M").group()
AttributeError: 'NoneType' object has no attribute 'group'
# 使用 [] 的方法,来同时匹配大小写m
In [10]: re.match("[mM]","M").group()
Out[10]: 'M'
In [11]:
# 再来匹配大小写 a到z 的字母,当然这也是匹配一个字符而已,那么怎么匹配多个字符呢?
In [11]: re.match("[a-zA-Z]","M").group()
Out[11]: 'M'
In [12]:
# 增加一个 * 号,那样就可以匹配出多个大小写字母了。
In [13]: re.match("[a-zA-Z]*","Mmasd").group()
Out[13]: 'Mmasd'
# 如果不用 * 号,那么一个 [] 只能匹配一个字符,这里写了两个 [] ,那么当然就是匹配出两个字符了。
In [14]: re.match("[a-zA-Z][a-zA-Z]","Mmasd").group()
Out[14]: 'Mm'
In [15]:
# 那么来想一下,使用大小写字母来匹配数字,肯定会报错。那么加个 * 号 会不会报错呢?
In [15]: re.match("[a-zA-Z]","123456").group()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-15-68dd0d7f6c8c> in <module>
----> 1 re.match("[a-zA-Z]","123456").group()
AttributeError: 'NoneType' object has no attribute 'group'
# 从结果来看,是没有报错的。因为 * 号的原因就是匹配前面的字符是否存在0次,或者多次的情况。这次匹配就是0次,那么直接就返回空字符串了。
In [16]: re.match("[a-zA-Z]*","123456").group()
Out[16]: ''
In [17]:
匹配前一个字符出现1次或者无限次,即至少有1次:
代码语言:javascript复制# 上面用 * 号的时候,匹配不到直接返回空字符串,则没有报错。
# 那么换成 号就报错了,因为 号是一定至少需要有一个字母来匹配的。
In [17]: re.match("[a-zA-Z] ","123456").group()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-17-c8ba700cee8c> in <module>
----> 1 re.match("[a-zA-Z] ","123456").group()
AttributeError: 'NoneType' object has no attribute 'group'
# 那么改成 * 号,允许0次字母匹配。再加 d 至少一个或者多个数字匹配,淡定OK
In [19]: re.match("[a-zA-Z]*d ","123456").group()
Out[19]: '123456'
In [20]:
匹配前一个字符出现1次或者0次,即要么有1次,要么没有:?
有时候匹配一个字符不知道到底有没有的时候,就可以使用 ?
号处理,如下:
# 再最后增加一个下划线来匹配,淡定发现报错。
In [20]: re.match("[a-zA-Z]*d _","123456").group()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-20-5266a50cf59d> in <module>
----> 1 re.match("[a-zA-Z]*d _","123456").group()
AttributeError: 'NoneType' object has no attribute 'group'
# 在下划线后面增加一个 ? 号,来设置不知道有没有下划线
In [21]: re.match("[a-zA-Z]*d _?","123456").group()
Out[21]: '123456'
# 那么如果有下划线,就会把下划线匹配出来
In [22]: re.match("[a-zA-Z]*d _?","123456_").group()
Out[22]: '123456_'
In [23]: re.match("[a-zA-Z]*d _?","123456_12312").group()
Out[23]: '123456_'
In [24]:
匹配一个 0 至 99 的数字:
代码语言:javascript复制# 如果直接匹配两个字符 [] [] ,那当然会报错
In [24]: re.match("[0-9][0-9]","1").group()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-24-b9459313bc26> in <module>
----> 1 re.match("[0-9][0-9]","1").group()
AttributeError: 'NoneType' object has no attribute 'group'
# 给第一个[] 设置 ?号,那么就可以判断可能不存在第一个字符,只有一个。
In [25]: re.match("[0-9]?[0-9]","1").group()
Out[25]: '1'
In [26]: re.match("[0-9]?[0-9]","11").group()
Out[26]: '11'
In [27]: re.match("[0-9]?[0-9]","99").group()
Out[27]: '99'
In [28]:
In [53]: re.match("[0-9]?d","09").group()
Out[53]: '09'
匹配前一个字符出现m次:{m}
需求:匹配出,8到20位的密码,可以是大小写英文字母、数字、下划线
代码语言:javascript复制# 首先匹配大小写字母,数字,下划线 使用 w 即可
In [55]: re.match("w","a").group()
Out[55]: 'a'
In [56]: re.match("w","A").group()
Out[56]: 'A'
In [57]: re.match("w","1").group()
Out[57]: '1'
In [58]: re.match("w","_").group()
Out[58]: '_'
# 那么就是需要确定匹配多少个,这时候使用{ 8,20 } 即可匹配8到20位这个 w 的字符了。
In [62]: re.match("w{8,20}","123").group()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-62-24a5057f6d58> in <module>
----> 1 re.match("w{8,20}","123").group()
AttributeError: 'NoneType' object has no attribute 'group'
In [63]:
In [63]: re.match("w{8,20}","12345678").group()
Out[63]: '12345678'
In [64]: re.match("w{8,20}","12345678aAhjjhc____").group()
Out[64]: '12345678aAhjjhc____'
In [65]:
匹配出163的邮箱地址
@符号之前有4到20位大小写字符、数字、以及下划线,开头必须是字母,不能是下划线、数字。
正确 :fatboy@163.com
错误: 1ajsdhj@163.comm
In [68]: re.match('[a-zA-Z]w{3,19}@163.com','fatboy@163.com').group()
Out[68]: 'fatboy@163.com'
In [69]:
In [70]: re.match('[a-zA-Z]w{3,19}@163.com','1fatboy@163.com').group()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-70-020ba8a3bbe7> in <module>
----> 1 re.match('[a-zA-Z]w{3,19}@163.com','1fatboy@163.com').group()
AttributeError: 'NoneType' object has no attribute 'group'
In [71]:
寻找smoke的胖老板题目 - 使用findall方法
如下:
代码语言:javascript复制ajsdlka;sjd;lkjas;dlkujqoiueioujasldkasjlkdasdljkhalalksj;dla,msdmnas;lkdkasmdkl;amsx,.asjdklsomkeaskldjkalsjdklasmd,mxznjhsaioduoiwuasdjhkljasmnxnlkjsxhjalsdnkjlasbldkjnasdjnajsldnajlskdsmokeasjdlka;sjd;lkjasd;lkjasdsmokesmoke
问在这里面有多少个smoke?
代码语言:javascript复制In [86]: question = "ajsdlka;sjd;lkjas;dlkujqoiueioujasldkasjlkdasdljkhalalksj;
...: dla,msdmnas;lkdkasmdkl;amsx,.asjdklsomkeaskldjkalsjdklasmd,mxznjhsaiod
...: uoiwuasdjhkljasmnxnlkjsxhjalsdnkjlasbldkjnasdjnajsldnajlskdsmokeasjdlk
...: a;sjd;lkjasd;lkjasdsmokesmoke"
In [87]: result = re.findall('smoke',question)
In [88]: print(len(result))
3
In [89]: print(result)
['smoke', 'smoke', 'smoke']
In [90]:
胖子老板:你哪里get到这个findall方法的,前面都没说啊
别着急,我后面继续写。