正则表达式
- 用来保证数字规范,它是数据表达式的一种规则,多种语言通用
- 可以用来查找对应规则下的数据
- 可以用来判断用户提供数据是否规范
如何使用正则表达式匹配数据
import re
result = re.match(正则表达式,要匹配的字符串)
# 如果上一步匹配的话,可用group提取
result.group()
小demo感受下正则表达式能做什么
import re
re.match(r"hello",hello world)
# 如果有返回值,则匹配成功
re.match("[hH]ello",hello world)
# 匹配大小写h开头
正则表达式匹配单个字符
匹配单个数字
import re
# \d等价于任意一位数字0-9
ret = re.match(r"速度与激情\d","速度与激情2")
# 用group提取数据
ret.group()
# 如果缩小这个一位数字的范围1-8
# ret = re.match(r"速度与激情[1,2,3,4,5,6,7,8]","速度与激情9")
ret = re.match(r"速度与激情[1-8]","速度与激情9")
# 用group提取数据
ret.group()
# 如果这个数字是不连续的
ret = re.match(r"速度与激情[3-57-8]","速度与激情6")
# 注意:[]里面可以有数字和字母
小实例:判断变量名是否非法
\w匹配词、\s匹配空白、.匹配任意字符
from re import match
# \w 匹配大小写字母和下划线,及其它形式语言中文,所以涉猎太广,慎用
ret = match(r"速度与激情\w","速度与激情_")
ret.group()
# \s表示空白字符包括:空格,tab键
#\D 表示非数字
#\S表示非空白
#\W表示非单词
正则表达式匹配多个字符
- \d\d匹配两位数字,一位数字不符合要求
- \d{1,2}表示一个d或者两个d,也就是一位数字或者两位数字。如:请输入手机号\d{11}
- \d{5,8}表示数字个数5~8个
- ?表示?问号前一个的内容可有可无
- re.match(r"\d{3,4}-?\d{7,8}“,010-12345678*
- *表示零个一个多个,.表示任意字符,除了换行符,.* 表示除了换行符的任意字符
- +表示一个多个字符不可为空
from re import match
def main():
names = ["_name","abe0","Carry","0abdv"]
for i in names:
# *表示前文中间部分可以有一个或多个
# 注意此时age!明明不符合也通过了,因为match此时只匹配开头,如果开头通过,结尾就不管了
# ret = match(r"[a-zA-Z_][a-zA-Z0-9_]*",name)
# 加上$表示一直匹配到结尾
ret = match(r"^[a-zA-Z_][a-zA-Z0-9_]*$",name)
# ^表示从开头开始匹配
if ret:
print("基本符合变量名的规则" %ret.group())
else:
print("变量名%s一定非法" % name)
if__name__ =="__main__":
main()
from re import match
def main():
email = input("请输入邮箱地址")
# 注意.表示任意字符,需要转义,需要转义的还有?*等等
ret = match(r"^[a-zA-Z0-9_]{4,20}@163\.com$",email)
if ret:
print("%s是163邮箱" %ret.group())
else:
print("%s非163邮箱地址" % name)
if__name__ =="__main__":
main()
re模块的分组功能用小括号
|在正则表达式中表示或者
ret = match(r"^[a-zA-Z0-9_]{4,20}@(126|163|qq)\.com$",email)
在正则表达式匹配成功的情况下,小括号里的内容可以单独提取,用group(序号)
ret = match(r"^([a-zA-Z0-9_]{4,20})@(126|163|qq)\.com$",email).group(1)
ret = match(r"^([a-zA-Z0-9_]{4,20})@(126|163|qq)\.com$",email).group(2)
分组还有一个应用,比如匹配html标签时,如下第一种写法可能匹配了不成对的标签,第二种才是正确的
re.match(<\w*>.*</\w*>,html_str)
re.match((<\w*>).*</\1>,html_str)
当分组很多时,可以给分组起一个别名 (?P<name>)(?P=name)
re.match((?P<p1><\w*>).*</(?P=p1)>,html_str)