python学习--re模块

一、结合match匹配任意字符串

(一)匹配单个字符串

字符 功能
. 匹配任意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次

(三)匹配开头和结尾

字符 功能
^ 匹配字符串开头
$ 匹配字符串结尾

(四)匹配一手机号 (不是以4、7结尾的手机号码(11位))

import re
tel_num = '13411331125'
re_obj = re.compile(r"1[34578][0-9]{8}[0-35-68-9]$")
match_tel_num = re_obj.match(tel_num)
print match_tel_num.group()

(五)匹配一个邮箱 (匹配出163的邮箱地址,且@符号之前有4到20位,例如[email protected]

import re
email = "[email protected]"
# 1、邮箱地址以大小写字母,数字,下划杠组成
# 2、而\w里面还包括汉子,所以不能用。
# 3、{m,n}之间,后面不能有空格
# 4、邮箱地址的.得用\转义,否则按任意字符算
# 5、如果在.com后面不跟上$那么com后还有字符串得情况也同样匹配
match_email = re.match("[a-zA-Z0-9_]{4,20}@163\.com$", email)
print(match_email.group())

(六)匹配0-100之间的数字

import re
num = input("请输入一个0-100之间的数字:")
# 1、0-100首先十位输为1-9
# 2、10-99个位上得数为0-9
# 3、因为有一位数和两位数,所以十位数可以判定位可取可不取得
# 4、被匹配得对象必须为字符串类型
# 5、如果大部分条件满足,只有一部分不满足,那么可以用 |
# 6、一般情况下不要随便加空格,也算一个字符
match_num = re.match("[1-9]?[0-9]$|100", num)
if match_num:
    print("%s是0-100之间得数字。" % match_num.group())
else:
    print("%s不是0-100之间得数字。" % num)

二、匹配分组的用法

(一)匹配分组

字符 功能
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串

(二)匹配163,126,qq邮箱

import re
email_list = ["[email protected]", "a124223434.com", "[email protected]", "[email protected]"]
# 1、如果qq后面不用()分组得话,那么匹配不出来
# 2、我们应该分组来处理各种类型得邮箱.
# 3、如果在撇配多个邮箱得时候,我们只需要用 | 分割出各种可能得情况
# 4、如果我们匹配到了邮箱,想看下是什么类型得邮箱用group(1)这个1指的是第一组
# 5、group(n)里得参数意味着获取第几组数据
for email in email_list:
    match_email = re.match("[0-9a-zA-Z_]{4,20}@(163|126|qq)\.com", email)
    if match_email:
        print("%s符合邮箱格式,他是一个%s邮箱。" % (match_email.group(), match_email.group(1)))
    else:
        print("%s不符合邮箱格式。" % email)

(三)提取区号和电话号码

import re
phone_num = "0351-5600123"
# 1、要想提取,那么先用正则匹配,然后分组
# 2、以后遇到提取数据一般用正则分组
# 3、区号是以0开始的,并且可以出现三位或者四位
# 4、凡事以后不确定位数的都用?
# 5、电话号码开头不能为0,一般为7位或者8位用{m,n}
match_p_num= re.match("(0\d{2}\d?)-([1-9]\d{6,7}$)", phone_num)
print(match_p_num)
print("提取的区号是:%s" % match_p_num.group(1))

(四)分组的高级用法1

# 匹配出<html>hh</html>
import re
ret = "<html>hh</html>"
# 1、尖括号里面可能出现的是大写字母和小写字母
# 2、而且不同尖括号里的内容大致相同
# 3、尖括号里的东西至少出现1次。用+
# 4、中间的内容位任意字符,可以出现0次以上
# 5、如果我们再重复斜前面的显得有些麻烦,可以选择把重复的内容分组匹配
# 6、\1代表第一次从左往右括号里分组的重复内容
# 7、凡事用正则就把r加上。防止转义了其中带\的
match_ret = re.match(r"<([a-zA-Z]+)>\w*</\1>", ret)
print(match_ret.group())

(五)分组的高级用法2

# 匹配出<html><h1>www.itcast.cn</h1></html>
import re
# 1、匹配网址
# 2、如果尖括号出现多个,在用\1\2容易混淆
# 3、那么我们需要再撇配的内容前加上(?P<name1>)(?P=name1)
# 4、摘取网址信息
# 5、python解释器会提示错误信息,不要理会
ret = "<html><h1>www.itcast.cn</h1></html>"
match_ret = re.match(r"<([a-zA-Z]+)><([a-zA-Z0-9]+)>([w]{3}\.\w+\.cn)</\2></\1>", ret)
print(match_ret.group())
print(match_ret.group(3))
match_ret1 = re.match(r"<(?P<a1>[a-zA-Z]+)><(?P<a2>[a-zA-Z0-9]+)>([w]{3}\.\w+\.cn)"
                      r"</(?P=a2)></(?P=a1)>", ret)
print(match_ret1.group())

三、re模块的高级用法

(一)search的用法 ( 匹配出文章阅读的次数)

import re
ret = "文章的阅读次数位:9999"
# 1、如果想匹配文章的次数,用match就不可以了
# 2、因为match是从字符串开头开始匹配。
# 3、而我先现在需要搜寻任意地方符合正则的字符串
# 4、提炼出次数,全是数字就ok
search_ret = re.search("\d+", ret)
print(search_ret.group())

(二)findall的用法 (统计出python、c、c++相应文章阅读的次数)

import re
ret =  "python = 9999, c = 7890, c++ = 12345"
# 1、search搜索得到第一个符合标准的情况就不搜索了。
# 2、而要想取出全部的数字部分,那么的用findall
# 3、注意findall不需要group
# 4、findall返回的是一个列表
findall_ret = re.findall(r"\d+", ret)
print(findall_ret)

(三)sub的用法

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

        </div>
"""
# 1、第一个参数是正则
# 2、第二个参数是符合正则的替换的字符串
# 3、第三个参数是文本内容
# 4、只要把所有的尖括号替换成""就ok了
# 5、如果我们不用?那么相当于开启贪婪模式,那么从第一个尖括号开始,知道遇到最后一个尖括号才结束,里面的内容都被替换
# 6、所以我们必须用?关闭贪婪模式。
# 7、用strip处理所有的空格。
sub_content = re.sub(r"<.+?>", "", content)
print(sub_content.strip())

(四)split的用法 (切割字符串“info:xiaoZhang 33 shandong”)

import re
ret = "info:xiaoZhang 33 shandong"
# 1、如果字符串中出现了多种富豪,那么不能用普通的字符串切割,会很麻烦,应该用正则切割
# 2、切割后返回一个列表
# 3、第一个参数是正则需要处理的富豪
# 4、注意如果出现空格,则必须打出来。否则效果不一样
      split_ret = re.compile(":| ")
split_data = split_ret.split( ret)
print(split_data)

(五)贪婪模式和非贪婪模式

import re
s = "This is a number 234-235-22-423"
# 1、贪婪模式一般针对于match和sub使用
# 2、如果在在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。
match_s = re.match("(.*)(\d+-\d+-\d+-\d+)", s)
# 打印效果如下-因为处于贪婪模式,只给你留一个符合匹配的。
print(match_s.group(1))
print(match_s.group(2))
# This is a number 23
# 4-235-22-423
# 3、关闭贪婪模式
match_s1 = re.match("(.*?)(\d+-\d+-\d+-\d+)", s)
# 这样的话只要后年有满足的条件,就让后面满足
print(match_s1.group(1))
print(match_s1.group(2))
# This is a number
# 234-235-22-423

猜你喜欢

转载自blog.csdn.net/zhangmoyan9527/article/details/81904440