【Python从入门到精通】二、核心编程:5.正则表达式

#!/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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值