码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 从基础到代码实战,带你进阶正则表达式的全方位应用


    合集 - 开发与运维(39)
    1.面试官:你能简单聊聊MyBatis执行流程02-022.一文详解应用安全防护ESAPI02-043.一个线程,从“生”到“死”经历的过程02-054.KubeEdge v1.16.0 版本发布!10项新增特性02-055.解密JavaChassis3:易扩展的多种注册中心支持02-066.解析Sermant热插拔能力:服务运行时动态挂载JavaAgent和插件02-087.想设计一个高并发的消息中间件前,先熟悉一下这些知识点02-178.华为云GES助力九洲平台:探索确定性运维的新实践02-179.0-overlay和underlay,这两种容器网络你分得清吗02-1810.教你用Rust实现Smpp协议02-1811.基于OpenTelemetry实现Java微服务调用链跟踪02-1912.揭开华为云ADN提高网络质量的秘密02-1913.详解网络知识:iptables规则02-1914.实例详解在Go中构建流数据pipeline02-2115.面试官让我讲讲MySQL三大核心日志实现原理02-2116.华为云帕鲁服务器-云耀云容器版,到底强在哪?02-2217.掌握云容器网络:何为ipvs02-2218.一文带你了解容器探针02-2319.教你如何判断Java代码中异步操作是否完成02-2620.深入解析Python并发编程的多线程和异步编程02-2721.教你如何用Keepalived和HAproxy配置高可用 Kubernetes 集群02-2822.容器化环境中,JVM最佳参数配置实践02-2923.关于Python中math 和 decimal 模块的解析与实践02-2924.运维一款月变更70+次的服务,是一种什么体验?03-0125.详解Python中sys模块的功能与应用03-0426.教你用Ubuntu快速搭建饥荒服务器03-0427.分享一个能让你的研发效率提升超过20%的工具03-0628.下一代积木式智能组装编排,集成开发效率10倍提升03-0629.如何基于容器网络流量指标进行弹性伸缩03-0630.Sermant运行流程学习笔记,速来抄作业03-0631.用几张图实战讲解MySQL主从复制03-0732.速存,详细罗列香橙派AIpro外设接口样例大全(附源码)03-0733.CCE集群VPC网络模式下几种访问场景03-1134.聊聊CWE 4.14 与 ISA/IEC 62443中,如何保障工业软件的安全性03-1235.20个Python random模块的代码示例03-1336.Java获取堆栈信息的3种方法03-1337.Prometheus多集群监控的3种方案,你选哪种?03-1438.手把手的使用Toolkit插件在诗情画意中完成AI诗朗诵03-14
    39.从基础到代码实战,带你进阶正则表达式的全方位应用03-14
    收起

    本文分享自华为云社区《Regex Mastery: 从基础到高级,解锁正则表达式的全方位应用》,作者:柠檬味拥抱。

    正则表达式是一种强大的文本匹配和处理工具,广泛应用于文本处理、数据抽取、表单验证等领域。本文将从正则表达式的基础知识出发,逐步深入,最终结合代码实战,带你全面了解正则表达式的奥妙。

    正则表达式基础

    1. 什么是正则表达式?

    正则表达式是一种描述字符串匹配规则的文本模式,可以用来检索、替换、验证等操作。它由一系列字符和操作符组成,表示一种匹配规则。

    2. 基础语法

    • 字符匹配: 使用普通字符直接匹配文本,如 abc 匹配字符串中的 “abc”。
    • 元字符: 具有特殊意义的字符,如 . 表示匹配任意字符,^ 表示匹配字符串的开头。
    • 字符类: 用方括号表示,如 [aeiou] 匹配任何一个元音字母。

    3. 量词和边界

    • 量词: 用于指定匹配的次数,如 * 表示零次或多次,+ 表示一次或多次,? 表示零次或一次。
    • 边界: 使用 ^ 表示字符串的开头,$ 表示字符串的结尾。

    正则表达式代码实战

    1. 使用正则表达式验证邮箱

    复制代码
    import re
    
    def validate_email(email):
        pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
        if re.match(pattern, email):
            print(f"{email} 是一个有效的邮箱地址")
        else:
            print(f"{email} 不是一个有效的邮箱地址")
    
    # 测试
    validate_email("user@example.com")
    validate_email("invalid_email@.com")
    复制代码

    2. 提取HTML中的链接

    复制代码
    import re
    
    html_content = 'Visit our website'
    
    # 提取链接
    links = re.findall(r'href="([^"]*)"', html_content)
    
    # 输出链接
    for link in links:
        print(f"链接: {link}")
    复制代码

    3. 替换文本中的日期格式

    复制代码
    import re
    
    text = "今天是2024年2月27日,明天是2024-02-28。"
    
    # 替换日期格式
    formatted_text = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', text)
    
    print(f"替换前: {text}")
    print(f"替换后: {formatted_text}")
    复制代码

    4. 使用正则表达式判断密码强度

    复制代码
    import re
    
    def check_password_strength(password):
        # 至少8个字符,包含至少一个大写字母、一个小写字母、一个数字和一个特殊字符
        pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$'
        
        if re.match(pattern, password):
            print("密码强度符合要求")
        else:
            print("密码强度不够")
    
    # 测试
    check_password_strength("StrongPass123!")
    check_password_strength("weakpassword")
    复制代码

    5. 从文本中提取手机号码

    复制代码
    import re
    
    text = "请联系客户:+86 13812345678 或者发送邮件至info@example.com"
    
    # 提取手机号码
    phone_numbers = re.findall(r'(?:(?:\+|00)86)?1[345789]\d{9}', text)
    
    # 输出手机号码
    for number in phone_numbers:
        print(f"手机号码: {number}")
    复制代码

    6. 拆分逗号分隔的字符串

    复制代码
    import re
    
    csv_data = "apple,orange,banana,grape"
    
    # 使用正则表达式拆分
    items = re.split(r',', csv_data)
    
    # 输出拆分结果
    print("拆分后的结果:", items)
    复制代码

    7. 使用正则表达式验证URL

    复制代码
    import re
    
    def validate_url(url):
        # 简单的URL验证,以http或https开头,后面跟着域名
        pattern = r'^(https?://)?[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(?:/[^/#?]+)*(?:\?[^#]*)?(?:#(.*))?$'
        
        if re.match(pattern, url):
            print(f"{url} 是一个有效的URL")
        else:
            print(f"{url} 不是一个有效的URL")
    
    # 测试
    validate_url("https://www.example.com")
    validate_url("ftp://invalid-url.com")
    复制代码

    8. 从HTML中提取文本内容

    复制代码
    import re
    
    html_content = '

    This is a sample HTML content.

    ' # 提取纯文本内容 text_content = re.sub(r'<[^>]+>', '', html_content) print(f"HTML内容: {html_content}") print(f"提取后的文本内容: {text_content}")
    复制代码

    9. 匹配重复字符

    复制代码
    import re
    
    text = "这个单词是重复重复的,但是它们都是有意义的重复。"
    
    # 匹配连续重复的单词
    repeated_words = re.findall(r'\b(\w+)\s+\1\b', text)
    
    # 输出匹配结果
    print("连续重复的单词:", repeated_words)
    复制代码

    10. 使用正则表达式提取日志信息

    复制代码
    import re
    
    log_data = """
    2024-02-27 10:15: Error in module A
    2024-02-27 11:30: Warning in module B
    2024-02-27 12:45: Info: Application started
    """
    
    # 提取日志信息
    log_entries = re.findall(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}): (Error|Warning|Info): (.+)', log_data)
    
    # 输出提取结果
    for entry in log_entries:
        timestamp, log_level, message = entry
        print(f"{timestamp} - [{log_level}] {message}")
    复制代码

    11. 使用正则表达式进行文本替换

    复制代码
    import re
    
    text = "这是一个示例文本,包含一些需要替换的词汇,例如apple和orange。"
    
    # 替换文本中的水果名称
    replaced_text = re.sub(r'\b(apple|orange)\b', 'fruit', text)
    
    print(f"替换前: {text}")
    print(f"替换后: {replaced_text}")
    复制代码

    12. 匹配多行文本

    复制代码
    import re
    
    multiline_text = """
    This is line 1.
    Another line here.
    And a third line.
    """
    
    # 匹配包含"line"的行
    matching_lines = re.findall(r'.*line.*', multiline_text, re.MULTILINE)
    
    # 输出匹配结果
    for line in matching_lines:
        print(f"匹配的行: {line}")
    复制代码

    我们深入了解了正则表达式在处理日志、进行文本替换等实际场景中的应用。正则表达式的强大之处在于它的灵活性和通用性,可以适应各种文本处理需求。希望这些例子能够进一步拓展你对正则表达式的认识,并激发你在实际项目中更广泛地应用它的兴趣。如果有其他关于正则表达式的问题或者需要更多的实例,欢迎继续提问。

    13. 正则表达式分组与捕获

    在正则表达式中,使用括号可以创建分组,通过分组可以实现更精细的匹配和捕获。

    复制代码
    import re
    
    text = "2024-02-27 08:30: Process A started, Process B started"
    
    # 匹配并捕获时间和进程名称
    pattern = r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}): (Process [A-Z]) started'
    matches = re.findall(pattern, text)
    
    # 输出捕获结果
    for match in matches:
        timestamp, process_name = match
        print(f"时间: {timestamp}, 进程: {process_name}")
    复制代码

    14. 非贪婪匹配

    正则表达式默认是贪婪匹配,即尽可能匹配更多的字符。在量词后加上?可以实现非贪婪匹配。

    复制代码
    import re
    
    text = "bold text and italic text"
    
    # 贪婪匹配
    greedy_match = re.search(r'<.*>', text).group()
    
    # 非贪婪匹配
    non_greedy_match = re.search(r'<.*?>', text).group()
    
    print(f"贪婪匹配: {greedy_match}")
    print(f"非贪婪匹配: {non_greedy_match}")
    复制代码

    15. 使用正则表达式验证IP地址

    import re
    
    def validate_ip_address(ip):
        pattern = r'^(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)(\.(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)){3}$'
        
        if re.match(pattern, ip):
            print(f"{ip} 是一个有效的IP地址")
        else:
            print(f"{ip} 不是一个有效的IP地址")
    
    # 测试
    validate_ip_address("192.168.0.1")
    validate_ip_address("256.0.0.1")
    

    通过这些高级的正则表达式实例,我们进一步提升了对正则表达式功能的理解和应用。分组、非贪婪匹配等特性使得正则表达式更加灵活和强大,能够满足更复杂的匹配需求。希望这些例子有助于你更深入地理解和运用正则表达式。如果你还有其他关于正则表达式的问题,欢迎提出。

    16. 零宽断言

    零宽断言是一种特殊的正则表达式结构,用于在匹配位置上添加条件,但并不消耗字符。常见的零宽断言包括正向先行断言((?=...))、负向先行断言((?!...))、正向后行断言((?<=...))、负向后行断言((?)等。

    import re
    
    text = "apple orange banana"
    
    # 匹配单词前面是"apple"的空格
    positive_lookahead = re.search(r'apple(?=\s)', text).group()
    
    # 匹配单词前面不是"apple"的空格
    negative_lookahead = re.search(r'(?
    

    17. 使用正则表达式验证日期格式

    import re
    
    def validate_date(date):
        pattern = r'^(19|20)\d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$'
        
        if re.match(pattern, date):
            print(f"{date} 是一个有效的日期格式")
        else:
            print(f"{date} 不是一个有效的日期格式")
    
    # 测试
    validate_date("2024-02-27")
    validate_date("2024/02/27")
    

    18. 正则表达式的替换与回调函数

    利用正则表达式进行替换时,可以结合回调函数,实现更复杂的替换逻辑。

    复制代码
    import re
    
    def multiply(match):
        number = int(match.group(1))
        return str(number * 2)
    
    text = "Numbers: 2, 5, 8, 12"
    
    # 使用回调函数替换数字
    result = re.sub(r'\b(\d+)\b', multiply, text)
    
    print(f"替换前: {text}")
    print(f"替换后: {result}")
    复制代码

    通过这些高级的正则表达式实例,我们深入了解了零宽断言、日期格式验证以及替换与回调函数的应用。这些功能强大的特性使得正则表达式成为处理复杂文本匹配和替换任务的得力工具。希望这些例子有助于你更灵活地运用正则表达式解决实际问题。如果你还有其他关于正则表达式的疑问或需求,欢迎继续提问。

    总结

    通过本文的内容,我们全面深入地探讨了正则表达式的基础知识和高级应用。在基础部分,我们学习了正则表达式的基本概念、语法元素以及常见的匹配规则。随后,我们通过多个实例展示了正则表达式在不同场景的代码应用,包括邮箱验证、HTML链接提取、文本替换、密码强度验证等。

    在高级部分,我们介绍了正则表达式的进阶特性,包括分组与捕获、非贪婪匹配、零宽断言等。这些特性使得正则表达式更加灵活,能够应对更复杂的文本匹配需求。同时,我们还探讨了如何使用正则表达式验证日期格式、IP地址,以及利用回调函数实现更复杂的替换逻辑。

    通过这篇文章,读者不仅学到了正则表达式的基础知识,还深入了解了它在实际编程中的广泛应用。正则表达式作为文本处理的得力工具,能够提高开发效率,简化代码逻辑。希望本文的内容能够帮助读者更自信、更灵活地运用正则表达式解决实际问题,同时也鼓励进一步深入学习和探索这一强大工具。如有任何问题或疑问,欢迎随时提问,共同学习进步。

    点击关注,第一时间了解华为云新鲜技术~

     

  • 相关阅读:
    苍穹外卖笔记
    IIR滤波器的设计与实现(内含设计IIR滤波器的高效方法)
    那些一门心思研究自动化测试的人,最后都怎样了?
    vue3 使用语法糖,子父子间的传值以及方法调用
    CSR格式如何更新? GES图计算引擎HyG揭秘之数据更新
    python3.10 安装问题解决
    牛客网AI面试第二弹
    超简单!!!搭建阿克曼ROS小车
    DPDK ACL算法介绍(一)
    云原生微服务架构图
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/18072384
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号