#!/usr/bin/env python
# -*- coding:utf-8 -*-
# regular expression
import re
# 一、re初级用法
ret = re.match('www', 'www.baidu.com.wwww')
print(ret)
print(ret.group()) # <re.Match object; span=(0, 3), match='www'> www
# 1 . 匹配任意一个字符
print(re.match('.', 'ab').group())
# 2 [] 匹配[]中列举的字符
print(re.match('[b]', 'bacdefg').group())
# 3 . 匹配除换行符以外的任意字符
# \w 匹配字母或数字或下划线或汉字 等价于 '[^A-Za-z0-9_]'。
# \s 匹配任意的空白符
# \S 匹配任意的字母
# \d 匹配数字
# \b 匹配单词的开始或结束
# ^ 匹配字符串的开始
# $ 匹配字符串的结束
# \w能不能匹配汉字要视你的操作系统和你的应用环境而定
print(re.match("嫦娥一号", "嫦娥一号升空了").group())
print(re.match("嫦娥\d号", "嫦娥1号升空了").group())
print(re.match("嫦娥\S号", "嫦娥一号升空了").group())
# 4 字符串前加 r 表示原生字符串 解除转义字符的困扰
mm = "c:\\a\\b\\c"
print(mm) # c:\a\b\c
print(re.match("c:\\\\a", mm).group()) # c:\a
print(re.match(r"c:\\a", mm).group()) # c:\a
# 5 表示数量
'''
* 匹配前一个字符出现 0-n次
+ 匹配前一个字符出现 1-n次
? 匹配前一个字符出现 0-1次
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符出现至少m次
{m,n}匹配前一个字符出现m-n次
'''
# 5.1 匹配第一个字符为大写字符 第二个字符为小写字符 且小写字符可有可无(*)
print(re.match('[A-Z][a-z]*', 'AbsdasdDsadsa').group()) # Absdasd
# 5.2 匹配变量名是否合法
print(re.match("[A-Za-z_]+[\w_]*", "name_").group())
print(re.match("[A-Za-z_]+[\w_]*", "_name1").group())
# print(re.match("[A-Za-z_]+[\w_]*","1name").group())
# 5.3 匹配出 0-99之间的数字(?)
print(re.match("[1-9]?[0-9]", "88").group())
print(re.match("[1-9]?[0-9]", "8").group())
# 5.4 匹配出8-20位的密码 密码可以是字符数字下划线({m})
print(re.match("[A-Za-z0-9_]{8,20}", "zhao123321").group())
# 练习 匹配出163的邮箱地址,且@符号前有4-20位
print(re.match("[A-Za-z0-9]{4,20}@163\.[\w]*", "17610907265@163.com").group())
# 6 表示边界 ^ 匹配字符串开头 $ 匹配字符串结尾 \b 匹配一个单词的边界 \B 匹配非单词边界
print(re.match("[A-Za-z0-9]{4,20}@163\.com$", "17610907265@163.com").group())
print(re.match(r".*\bver\b", "ho ver abc").group()) # ho ver
# print(re.match(r".*\bver\b","hover abc").group())
print(re.match(r".*\Bver\B", "hoverabc").group()) # hover
# print(re.match(r".*\Bver\B","ho verabc").group())
# 7、匹配分组
# | 匹配左右任意一个表达式 (ab) 将括号中字符作为一个分组
# \num 引用分组num匹配到的字符 (?P<name>) 分组起别名
# (?P=name) 引用别名为name分组匹配到的字符串
print(re.match("[1-9]?\d$|100", "100").group())
print(re.match("\w{4,20}@(126|163|qq).com$", "1asgsd@qq.com").group())
# 7.1 匹配 区号-电话号码
print(re.match("([^-]+)-(\d+)", "123424-223423").group(0))
# 7.2 引用分组num
print(re.match("<[A-Za-z]+>\w*</[A-Za-z]+>", "<html>sdsd</htmlaaa>").group())
print(re.match(r"<([A-Za-z]+)>\w*</(\1)>", "<html>sdsd</html>").group())
print(re.match(r"<([A-Za-z0-9]+)><([A-Za-z0-9]+)>.*</\2></\1>", "<html><h1>www.baidu.com</h1></html>").group())
# 7.3 (?P<name>) (?P=name)
print(re.match(r"<(?P<name1>[A-Za-z0-9]+)><(?P<name2>[A-Za-z0-9]+)>.*</(?P=name2)></(?P=name1)>", "<html><h1>"
"www.baidu.com</h1></html>").group())
# 100
# 1asgsd@qq.com
# 123424-223423
# <html>sdsd</htmlaaa>
# <html>sdsd</html>
# <html><h1>www.baidu.com</h1></html>
# <html><h1>www.baidu.com</h1></html>
# 二、re高级用法
# 1、search 匹配出人口数
print(re.search("\d+", "全球人口为70亿人").group())
# 2、findAll 匹配不同国家人口
print(re.findall("\d+", "中国14亿,美国4亿,日本2亿"))
# 3、sub将匹配到的数据进行替换
print(re.sub("\d+", "15", "中国14亿,美国4亿,日本2亿", 1))
# 通过函数回调 匹配并计算值返回
def add(temp):
num = temp.group()
return str(int(num) + 1)
print(re.sub(r"\d+", add, "python 99"))
# 70
# ['14', '4', '2']
# 中国15亿,美国4亿,日本2亿
# python 100
# 4、split切割值
print(re.split(":|: | ","hello:world welcome"))
# ['hello', 'world', 'welcome']
# 三、练习
# 提取url
dy_url = "<img data-original=\"https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg\" " \
"src=\"https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg\" style=\"display: inline;\">"
list = re.findall("(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*,]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)|"
"([a-zA-Z]+.\w+\.+[a-zA-Z0-9\/_]+)",dy_url)
print(list[0][0])
print(list[1][0])
# 找到单词
print(re.split(" ","we are the world"))
# 过滤网址
print(re.match("^http:.*[asp$]","http://www.interoem.com/messageinfo.asp?id=35").group())
print(re.match("^http:\S+.com","http://3995503.com/class/class09/news_show.asp?id=14").group())
# https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg
# https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg
# ['we', 'are', 'the', 'world']
# http://www.interoem.com/messageinfo.asp
# http://3995503.com
【Python从入门到精通】二、核心编程:5.正则表达式
最新推荐文章于 2024-08-14 12:00:04 发布