正则表达式

                                                                              正则表达式

import re
'''
.  匹配任意1个字符(除了\n)
[ ]    匹配[ ]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配非特殊字符,即a-z、A-Z、0-9、_、汉字
\W 匹配特殊字符,即非字母、非数字、非汉字
*  匹配前一个字符出现0次或者无限次,即可有可无
+  匹配前一个字符出现1次或者无限次,即至少有1次
?  匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m}    匹配前一个字符出现m次
{m,n}  匹配前一个字符出现从m到n次
^  匹配字符串开头
$  匹配字符串结尾
'''
# 匹配以数字开头/结尾的数据
ret = re.match("^\d.*\d$", "1q14567a3").group()
print('匹配以数字开头/结尾的数据', ret)
# 除了指定字符以外都匹配
ret = re.match(".*[^13].*", "12345ej6781").group()
print('除了指定字符以外都匹配', ret)
# 使用正则表达式把qq:10567这样的数据匹配处理
ret = re.match("qq:[1-9]\d{4,10}", "qq:10567").group()
print('qq', ret)
# 匹配以数字开头中间内容不管以数字结尾, 结尾不要4或者7
ret = re.match("^\d.*[1-35-68-9]$", "1qq:12345676").group()
print('匹配以数字开头中间内容不管以数字结尾, 结尾不要4或者7', ret)
# .匹配出163的邮箱地址,且@符号之前有4到20位,例如 hello@163.com
ret = re.match("[a-zA-Z0-9_]{4,20}@163\.com", " hr345678@163.com ").group()
print('匹配出163的邮箱地址,且@符号之前有4到20位', ret)
# 匹配出11位手机号码
ret = re.match("1[3-8]\d{9}", "144341578694").group()
print('匹配出11位手机号码', ret)
# 匹配出微博中的话题, 比如: #幸福是奋斗出来的#
ret = re.match("^#.*#$", "#幸福是奋#斗出来的#").group()
print('匹配出微博中的话题', ret)

"""  | 匹配左右任意一个表达式 """
# 在列表中["apple", "banana", "orange", "pear"],匹配apple和pear
fruit_list = ["apple", "banana", "orange", "pear"]
for value in fruit_list:
    ret = re.match("apple|pear", value)
    if ret:
        print('%s'% ret.group())
    else:
        print(None)

"""(ab)    将括号中字符作为一个分组 """
# 匹配出163、126、qq等邮箱
for mail in mail_list:
    ret = re.match("[a-zA-Z0-9_]{4,16}@(163|126|qq|yahoo|sina)\.com$", mail)
    if ret:
        print('%s' % ret.group())
    else:
        print(None)
# 匹配qq:10567这样的数据,提取出来qq文字和qq号码
ret = re.match("(qq):([1-9]\d{4,10})", "qq:10567")
print(ret.group(), '文字部分:', ret.group(1), '数字部分:', ret.group(2))

""" \num   引用分组num匹配到的字符串 """
# 匹配出<html>hh</html>
ret = re.match("<[a-zA-Z1-9]+>.*</[a-zA-Z1-9]+>", "<html>hh</div>")
print(ret.group())
list = ["<html>hh</html>", "<html>hh</div>"]
for i in list:
    ret = re.match("<([a-zA-Z1-9]+)>.*</\\1>", i)
    if ret:
        print(ret.group())
    else:
        print(None)

"""(?P<name>)  分组起别名 , (?P=name)  引用别名为name分组匹配到的字符串"""
ret = re.match("<(?P<name1>[a-zA-Z1-9]+)><(?P<name2>[a-zA-Z1-6]+)>.*</(?P=name2)></(?P=name1)>", "<html><h1> www.itcast.cn </h1></html>")
if ret:
    print(ret.group())
else:
    print("匹配失败")

"""re模块的高级用法"""
print('-'*10, 're模块的高级用法', '-'*10)

'''re.search 只查找一次 re.search(pattern, string, flags) pattern: 正则表达式 ; string: 要匹配的字符串'''
match_obj = re.search("\d+", "水果有20个 其中苹果10个")
print(match_obj.group())

''' re.findall 查找所有 re.findall(pattern, string, flags) pattern: 正则表达式 ; string: 要匹配的字符串'''
match_obj = re.findall("\d+", "水果有20个 其中苹果10个")
print(match_obj)

''' re.sub 将匹配到的数据进行替换 re.sub(pattern, repl, string, count)
pattern: 正则表达式 repl: 替换后的字符串 string: 要匹配的字符串 count=0 替换次数,默认全部替换 , count=1根据指定次数替换'''
result = re.sub("\d+", "22", "评论数:10 赞数:20", count=1)
print(result)
# 将匹配到的阅读数加1
def add(match_obj): # match_obj:该参数系统自动传入
    # 获取匹配结果的数据
    value = match_obj.group()
    result = int(value) + 1
    # 返回值必须是字符串类型
    return str(result)
result = re.sub("\d+", add, "阅读数:10")
print(result)

'''re.split 根据匹配进行切割字符串,并返回一个列表 re.split(pattern, string, maxsplit, flags)
pattern: 正则表达式 string:要匹配的字符串 maxsplit=1 分割次数, 0默认全部分割'''
my_str = '貂蝉,杨玉环:西施,王昭君'
result = re.split(",|:", my_str, maxsplit=0)
print(result)

my_str = """<div>
<p>岗位职责:</p>
<p>完成推荐算法、数据统计、接口、后台等服务器端相关工作</p>
<p>
</p>
<p>必备要求:</p>
<p>良好的自我驱动力和职业素养,工作积极主动、结果导向</p>
<p>&nbsp;
</p>
<p>技术要求:</p>
<p>1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式</p>
<p>2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架</p>
<p>3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种
</p>
<p>4、掌握NoSQL、MQ,熟练使用对应技术解决方案</p>
<p>5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js</p>
<p>&nbsp;
</p>
<p>加分项:</p>
<p>大数据,数理统计,机器学习,sklearn,高性能,大并发。</p>
</div>"""

# 根据正则表达式替换指定的标签数据
ret = re.sub('</?[a-zA-Z1-6]+>', '', my_str)
# print(ret.strip())

'''在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪'''

s="This is a number 234-235-22-423"
r=re.match(".+(\d+-\d+-\d+-\d+)", s) #
print(r.group(1))
r=re.match(".+?(\d+-\d+-\d+-\d+)", s)
print(r.group(1))

mstr = """<img alt="小浅月o的直播" data-original=" https://rpic.douyucdn.cn/live-cover/appCovers/2018/03/25/3544712_20180325111300_big.jpg " src=" https://rpic.douyucdn.cn/live-cover/appCovers/2018/03/25/3544712_20180325111300_big.jpg " width="283" height="163" class="JS_listthumb" style="display: block;">"""
r = re.search('https://.*?\.jpg', mstr)

if r:
    print(r.group())
else:
    None
import re

ret = re.match("^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~_%\\\\/])+$", Str) # right
if ret:
    print(ret.group())
else:
    None

ret = re.match("^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\\\/])+$", Str)# wrong
if ret:
    print(ret.group())
else:
    None
# 第一部分:校验协议。^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)。
# 第二部分:校验域名。(([A-Za-z0-9-~]+).)+。
# 第三部分:校验参数。([A-Za-z0-9-~\\/])+$。
#
# 我们可以发现正则表达式校验协议 http:// 这部分是没有问题的,但是在校验 www.fapiao.com 的时候,
# 其使用了 xxxx. 这种方式去校验。那么其实匹配过程是这样的:匹配到 www. 匹配到 fapiao.
# 匹配到 com/dzfp-web/pdf/download?request=6e7JGm38jf.....,你会发现因为贪婪匹配的原因,
# 所以程序会一直读后面的字符串进行匹配,最后发现没有点号,于是就一个个字符回溯回去了。
# 这是这个正则表达式存在的第一个问题。
# 另外一个问题是在正则表达式的第三部分,我们发现出现问题的 URL 是有下划线(_)和百分号(%)的,
# 但是对应第三部分的正则表达式里面却没有。这样就会导致前面匹配了一长串的字符之后,发现不匹配,最后回溯回去。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值