内置模块之re模块
re模块可以配合正则表达式使用。
在很多网页中,要求输入手机号、邮箱等,会在我们还没输完的情况下就提示我们在“请输入正确的手机号”“邮箱格式不正确”等信息,这用到了文字匹配的功能:
用普通的python代码实现是这样的:
while True:
phone_num = input('请输入手机号')
if len(phone_num) == 11:
if phone_num.isdigit():
if phone_num.startswith('13') or phone_num.startswith('15') or phone_num.startswith('18'):
print('手机号输入正确')
else:
print('手机号开头不对')
else:
print('请输入纯数字')
else:
print('手机号位数不对')
有点麻烦和繁琐
如果使用 re模块配合正则表达式
import re
phone_num = input('请输入手机号')
if re.match('^(13|15|18)[0-9]{9}$',phone_num):
print('格式正确')
else:
print('格式错误')
正则表达式是一门独立的技术 ,所有编程语言都可以使用。
正则表达式
字符组
采用{ }括起来的一组字符
正则表达式 | 解释 |
---|---|
[0123456789] | 匹配0到9任意一个数字 |
[0-9] | 匹配0到9任意一个数字 |
[a-z] | 匹配26个小写英文字母 |
[A-Z] | 匹配26个大写英文字母 |
[0-9a-zA-Z] | 匹配数字或者小写字母或者大写字母 |
特殊符号
元字符
. | 匹配除换行符以外的所有字符 |
---|---|
\w | 匹配字母或数字或下划线 |
\W | 匹配非字母或数字或下划线 |
\d | 匹配数字 |
\D | 匹配非数字 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
| | 或者 |
() | 匹配括号内的表达式,也表示一个组 |
[ ] | 字符组 |
举例:
正则 | 待匹配字符串 | 结果 | 解释 |
---|---|---|---|
\w | 'ab-ab-a' | ['a','b','a','b','a'] | 匹配字符串中的所有字母\数字\下划线 |
\w\w | 'ab-ab-a' | ['ab,'ab'] | 两个\w代表符合条件的两个字符连起来 |
[^a] | 'ab-ab-a' | ['b','-','b','-'] | 一个[。。。]仅表示匹配一个字符 |
注意:区分^在[..]内外含义的不同,在外侧表示匹配字符串开头,在内侧表示取反。
量词
量词是用来搭配和正则表达式配合使用的
* | 重复零次或更多次 |
---|---|
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
李.? | 李杰和李莲英和李二棍子 | 李杰 李莲 李二 | ?表示重复零次或一次,即只匹配"李"后面一个任意字符 |
李.* | 李杰和李莲英和李二棍子 | 李杰和李莲英和李二棍子 | *表示重复零次或多次,即匹配"李"后面0或多个任意字符 |
李.+ | 李杰和李莲英和李二棍子 | 李杰和李莲英和李二棍子 | +表示重复一次或多次,即只匹配"李"后面1个或多个任意字符 |
李.{1,2} | 李杰和李莲英和李二棍子 | 李杰和 李莲英 李二棍 | {1,2}匹配1到2次任意字符 |
[\d]+ | 456bdha3 | 456 3 | 表示匹配任意个数字,匹配到2个结果 |
贪婪匹配与非贪婪匹配
所有的量词都遵循在其最大限度的情况下切片走字符串中的满足条件的字符组合。
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
<.*> | <script>...</script> |
<script>...</script> |
默认为贪婪匹配模式,会匹配尽量长的字符串 |
<.*?> | r'\d' | <script> </script> |
加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串 |
注意:所有的量词在没有使用?时,默认都是默认贪婪匹配
re模块之匹配所有-findall
import re
res = re.findall('e', 'leethon eat apple') # 第一个参数给正则,第二个参数是待匹配字符串
print(res) # ['e', 'e', 'e', 'e']
# 匹配到几个满足表达式'e'的,就返回几个,并组成列表 会找到所有符合的元素。并返回列表。
re模块之匹配所有成为迭代器 - finditer
res = re.finditer('正则表达式','待处理文本')
print(res) # <callable_iterator object at 0x000001DA56E8A190>
print(list(res)) # [<re.Match object; span=(1, 2), match='e'>, <re.Match object; span=(2, 3), match='e'>]
# 匹配对象可以通过.group的方式拿到匹配的对象
#拿到个迭代器,每个结果都为匹配对象
re模块之匹配只匹配开头 - match
res = re.match('m', 'somnus')
print(res) # None
# 只匹配开头,不满足则返回None,相当于把我们的正则表达式前加个^
re模块之分组优先
res = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(res) # ['oldboy']
# findall分组优先展示: 优先展示括号内正则表达式匹配到的内容
res = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(res) # ['www.oldboy.com']
# 在组的括号中加入(?: ),就取消分组优先
标签:字符,匹配,正则表达式,res,re,模块,print
From: https://www.cnblogs.com/moongodnnn/p/16825974.html