当前位置: 首页 > article >正文

【进阶系列】正则表达式 #匹配

正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。re模块使 Python 语言拥有全部的正则表达式功能。

一个正则表达式的匹配工具:regex101: build, test, and debug regex

s = "C:\\a\\b\\c"
print(s)

# 正则表达式中遇见 \ 为转义字符,自动转义
# 若在前面加 r 说明是原生字符串,不转义

s1 = r"C:\\a\\b\\c"
print(s1)

re.match函数

re.match 是从字符串的起始位置匹配一个模式,匹配不成功就返回None。

语法格式:re.match(pattern, string, flags=0)
参数:
    pattern    需要匹配的正则表达式
    string     匹配的字符串
    flags      标志位,用于控制正则表达式的匹配方式,
                如:是否区分大小写,多行匹配等
    

若匹配到了数据,就可以使用group(num) 或 groups() 来提取数据了。

group(num=0)    匹配整个字符串,可以设置参数
groups()        返回一个元组,包含所有小组字符串的元组 
import re

# match从开始位置匹配
ret = re.match('hqyj', "hqyj world hqyj")
print(ret.group())

re.search函数

re.search 扫描整个字符串并返回第一个成功匹配的字符串。

import re
s1 = 'hqyj world hqyj'
s2 = 'hello hqyj world hqyj hahaha'

# search扫描整个字符串,返回第一个匹配的结果
set = re.search('hqyj', s2)
print(set, set.group())

re.findall函数

re.findall 匹配整个字符串,返回string中所有与pattern相匹配的全部子串,返回形式为列表

import re
s1 = 'hqyj world hqyj'
s2 = 'hello hqyj world hqyj hahaha'
# findall 扫描整个字符串,返回所有匹配的结果
fet = re.findall('hqyj', s2)
print(fet)
  1. re.match 从首字母匹配,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None。
  2. re.search 匹配整个字符串,直到找到一个对应匹配【若有多个,也只返回第一个】。
  3. re.findall 返回匹配到的所有子串。

正则表达式修饰符 - 可选标志

import re
s = 'Good good study, Day day up'
ret = re.findall('good', s, re.I)
print(ret)

正则表达式模式

模式字符串使用特殊的语法来表示一个正则表达式。

  1. 字母和数字表示他们自身。
  2. 一个正则表达式模式中的字母和数字匹配同样的字符串。
  3. 多数字母和数字前加一个反斜杠时会拥有不同的含义。
  4. 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
  5. 反斜杠本身需要使用反斜杠转义。

由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们

import re
s = '__ 888 hqyj 666 &&&&&'

ret1 = re.findall('.', s)
ret2 = re.findall('[h6]', s)
ret3 = re.findall(r'\d', s)
ret4 = re.findall(r'\D', s)
ret5 = re.findall(r'\w', s)
ret6 = re.findall(r'\W', s)

print(ret6)

import re

#匹配出一个字符串第一个字母为大写字符,后面都是小写字母并且这些小写字母可有可无
def fun1(s:str):
    ret = re.match(r'[A-Z][a-z]*', s)
    if ret:
        print(ret.group())
    else:
        print("匹配不成功")

s = 'Abcd777'
fun1(s)

#匹配变量名是否有效
def fun2(name:str):
    ret = re.match(r'[A-Za-z_]+[\w]*', name)
    if ret:
        print(ret.group())
    else:
        print("变量命名不合法")

name = '_a  '
fun2(name)

#匹配出6位密码,可以是大小写英文字母、数字、下划线
#匹配出,8到20位的密码,可以是大小写英文字母、数字、下划线
def fun3(pwd:str):
    ret = re.match(r'\w{8,20}', pwd)
    if ret:
        print(ret.group())
    else:
        print("密码不正确")

fun3('12345')

import re
#匹配163.com的邮箱地址
# 以^确定开头
# 通过$来确定末尾
myemail = 'hqyj_sunwy@163.com'
ret = re.match(r'^\w{4,20}@163\.com$', myemail)
print(ret.group())

import re

#匹配出163、126、qq邮箱
myemail = '2042856895@qq.com'
ret = re.match(r'^\w{4,20}@(163|126|qq)\.com$', myemail)
print(ret.group())

#匹配出<html><h1>www.bawei.com</h1></html>
ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", "<html><h1>www.hqyj.com</h1></html>")
print(ret.group())

#匹配出<html><h1>www.bawei.com</h1></html>
ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.hqyj.com</h1></html>")
print(ret.group())

注意贪婪和非贪婪

贪婪是尝试匹配尽可能多的字符。

非贪婪是尝试匹配尽可能少的字符。

解决方式:非贪婪操作符”?”,用在"*","+","?"的后面,要求正则匹配的越少越好。

import re
s = 'abbcdef123456'
ret = re.match(r'\w+', s)
print(ret.group())
# 输出结果:abbcdef123456
ret = re.match(r'\w+?', s)
print(ret.group())
# 输出结果:a


 未完待续(持续更新中🏆)


http://www.kler.cn/a/401019.html

相关文章:

  • 数据库-Derby
  • vue2动态导出多级表头表格
  • Diff 算法的误判
  • React Native 全栈开发实战班 :数据管理与状态之React Hooks 基础
  • 解决docker mysql命令行无法输入中文
  • Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系
  • 探寻优质的 PostgreSQL 中级认证专家学习机构
  • DNS域名解析服务器--RHCE
  • 使用SaaS化的Aurora应用快速搭建私人ChatGPT助手
  • Deep Fake Detection (DFD) Entire Original Dataset数据集下载
  • 11.18 机器学习-线性回归(重点)-最小二乘法
  • (二)PyTorch简要教学
  • 莱特币转型MEME币:背后隐含的加密市场现象
  • QT基本绘图
  • k8s 1.26安装
  • 集群聊天服务器(11)客户端开发
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-04
  • 小程序-基于java+SpringBoot+Vue的实习生管理系统设计与实现
  • 网络安全等级测评师
  • vue3的setup、ref、reactive
  • RDD转换算子:join方面的算子(leftOuterJoin、rightOuterJoin、fullOuterJoin)
  • Spring Boot汽车资讯:驾驭信息新浪潮
  • 【网络安全 | 漏洞挖掘】在重置密码流程利用请求头实现ATO
  • 软件测试丨Java常用库
  • webgis与纯前端相比如何?
  • 网络传输:网卡、IP、网关、子网掩码、MAC、ARP、路由器、NAT、交换机