re—正则表达式笔记

其实,不从事这份工作,学习起来真的是要吃力很多。花有限的时间学习,平时学习的知识得不到实践运用。只能靠这种方式来记录点点滴滴。希望能够有机会参与到实际工作中。能够在实际工作中得到运用。看了很多外包的任务,都是我胜任不了的,涉及到的知识都还是我现在没有接触到的。不知道哪位能够给点建议,能够从基础活开始做起。进入正题吧,正则表达式感觉还是非常重要的。
1、导入re模块
import re
2、使用match方法进行匹配操作
3、如果上一步匹配到数据的话,可以使用group()方法来提取数据
result = re.match(正则表达式, 要匹配的字符串)
rel = re.match(r"hello", “hello world”)
rel2 = re.match(r"[Hh]ello", “hello world”)
<re.Match object; span=(0, 5), match=‘hello’>
print(rel.group()) 输出匹配结果
re3 = re.match(r"速度与激情[1-9]", “速度与激情5”)
print(re3.group())
# 速度与激情5
[1-9] 匹配1-9的数字
re4 = re.match(r"速度与激情[1-9a-z]", “速度与激情c”)
print(re4.group())
# 速度与激情c
中括号[]里面的数据 只匹配一个数据
re3 = re.match(r"速度与激情[1-9a-z]", “速度与激情5c”)
print(re3.group())
# 速度与激情5

4、匹配单个字符
. 匹配任意1个字符(除了\n)
[] 匹配[]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字
\s 匹配空白,即空格 tab键
\S 匹配非空白
\w 匹配单词字符,即a-z, A-Z, 0-9, _ 和中文字符
\W 匹配非单词字符

5、匹配多个字符

  •   匹配前一个字符出现0次或者无限次,即可有可无
    
  •   匹配前一个字符出现1次或者无限次,即至少有一次
    

? 匹配前一个字符出现1次或者0次,即要么有一次,要么没有
{m} 匹配前一个字符出现m次
{m, n} 匹配前一个字符出现从m到n次

6、
| 匹配左右任意一个表达式
(ab) 将括号中的字符作为一个分组
\num 引用分组num匹配到的字符串 必须和前面相对应位置的元素一样
(?P) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串

7、re 模块的高级用法
search 不需要从头开始匹配
findall 返回的是列表,并且不需要用 group 取值
sub 先用正则匹配,匹配到的地方换成中间的值,替换之后,返回整个元素 sub 还可以支持函数的调用
split 根据匹配进行切割字符串,并返回一个列表

    re2 = re.match(r"速度与激情\d{1,3}", "速度与激情93")
    print(re2.group())
    # 速度与激情93
\d{1,3} 匹配1-3位数的数字
    re4 = re.match(r"速度与激情\d{3}", "速度与激情938")
    print(re4.group())
    # 速度与激情938
\d{3}  匹配3位数的数字
    re5 = re.match(r"上海的电话号码是:021-?\d{8}", "上海的电话号码是:021-12345678")
    print(re5.group())
    # 上海的电话号码是:021-12345678
    re5 = re.match(r"其他地区的电话号码是:\d{3,4}-?\d{7,8}", "其他地区的电话号码是:0556-4506817")
    print(re5.group())
    # 其他地区的电话号码是:0556-4506817
    re5 = re.match(r"其他地区的电话号码是:\d{3,4}-?\d{7,8}", "其他地区的电话号码是:05564506817")
    print(re5.group())
    # 其他地区的电话号码是:05564506817

-?  匹配'' - ''有或者没有
    re5 = re.match(r"其他地区的电话号码是:\d*", "其他地区的电话号码是:0556-4506817")
    print(re5.group())
    # 其他地区的电话号码是:0556
    re5 = re.match(r"其他地区的电话号码是:\d*", "其他地区的电话号码是:05564506817")
    print(re5.group())
    # 其他地区的电话号码是:05564506817
    html = """ fdsf
    dkjkdd
    jkjsdjl
    sjdljd """
三个双引号 的字符串可以换行打印
print(html)
#   fdsf
    dkjkdd
    jkjsdjl
    sjdljd
.* 除了 \n 以为的字符都可以匹配,有或者没有
    html = """  fdsf
                dkjkdd
                jkjsdjl
                sjdljd """

    re5 = re.match(r".*", html)
    print(re5.group())
    # fdsf
re.S  让 . 包含 \n  全部匹配上了
    re5 = re.match(r".*", html, re.S)
    print(re5.group())
    #   fdsf
        dkjkdd
        jkjsdjl
        sjdljd

match 默认匹配开头,^ 判断开头 $ 判断结尾

def main():
    lst = ["age", "_age", "1age", "a_age", "age_1_", "age!", "a#123"]
    for name in lst:
        ret = re.match(r"[a-zA-Z_][a-zA-Z0-9_]*$", name)
        if ret:
            print(f"变量名:{name} 符合要求....匹配出来的数据是: {ret.group()}")
        else:
            print(f"变量名:{name} 不符合要求")


if __name__ == "__main__":
    main()

结果:
变量名:age 符合要求…匹配出来的数据是: age
变量名:age 符合要求…匹配出来的数据是: age
变量名:1age 不符合要求
变量名:a_age 符合要求…匹配出来的数据是: a_age
变量名:age_1
符合要求…匹配出来的数据是: age_1

变量名:age! 不符合要求
变量名:a#123 不符合要求
案例: 匹配163的邮箱地址,且@ 符号之前有4-20位
例如 hello@163.com
如果在正则表达式中需要用到了某些普通的字符,比如. ? 等等,仅仅需要
在它们前面添加一个反斜杠 \

def main():
    email = input("请输入你的邮箱:")
    ret = re.match(r"[a-zA-Z0-9][a-zA-Z0-9_]{4,20}@163\.com$", email)
    if ret:
        print(f"邮箱: {email} 符合要求....匹配出来的邮箱是: {ret.group()}")
    else:
        print(f"邮箱:{email} 不符合要求")


if __name__ == "__main__":
    main()

分组
() 小括号可以有分组的功能 也可以单独从小括号里面取值

email = "laowang@163.com"
rel = re.match(r"([a-zA-Z0-9][a-zA-Z0-9_]{4,20})@(163|126)\.com$", email)
print(rel.group(1))
# laowang
html_str = "<h1>hhhhaaa</h1>"
rel = re.match(r"<(\w*)>.*</\1>", html_str)
print(rel.group())
# <h1>hhhhaaa</h1>
# \1 表示 第一个分组里面的值是多少 \1的地方就必须是多少
html_str1 = "<body><h1>hhhhaaa</h1></body>"
rel1 = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", html_str1)
print(rel1.group())
# <body><h1>hhhhaaa</h1></body>
# \2 \1 的位置要注意对应
html_str1 = "<body><h1>hhhhaaa</h1></body>"
rel1 = re.match(r"<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>", html_str1)
print(rel1.group())
# <body><h1>hhhhaaa</h1></body>
# 注意 P 要大写才行
ret = re.findall(r"\d+", "read=999, dian=888, zhuanfa=777")
print(ret)
#  ['999', '888', '777']
# 返回的是列表,并且不需要用 group 取值
ret = re.search(r"\d+", "阅读次数为999")
print(ret.group())
#  999
# 不需要从头开始匹配
ret = re.sub(r"\d+", "998", "python=997, c++=996")
print(ret)
# python=998, c++=998
# 先用正则匹配,匹配到的地方换成中间的值,替换之后,返回整个元素
# sub 还可以支持函数的调用
ret = re.split(r":| ","info:xiaozhang 33 shandong")
print(ret)
# ['info', 'xiaozhang', '33', 'shandong']
# split 分割,| 后面是空格,相当于就是 在 : 或者空格进行分割

这些东西等到要用的时候直接回来查看一下就可以。感觉还是挺不错的。就当作自己的笔记本用了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

维维不威威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值