首页 > 其他分享 >从基础到代码实战,带你进阶正则表达式的全方位应用

从基础到代码实战,带你进阶正则表达式的全方位应用

时间:2024-03-14 11:00:39浏览次数:28  
标签:匹配 进阶 正则表达式 text 全方位 re print import

本文分享自华为云社区《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("[email protected]")
validate_email("[email protected]")

2. 提取HTML中的链接

import re

html_content = '<a href="https://www.example.com">Visit our website</a>'

# 提取链接
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 或者发送邮件至[email protected]"

# 提取手机号码
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 = '<p>This is a <b>sample</b> HTML content.</p>'

# 提取纯文本内容
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 = "<b>bold text</b> and <i>italic text</i>"

# 贪婪匹配
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'(?<!apple)\s', text).group()

print(f"正向先行断言: {positive_lookahead}")
print(f"负向先行断言: {negative_lookahead}")

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地址,以及利用回调函数实现更复杂的替换逻辑。

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

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

 

标签:匹配,进阶,正则表达式,text,全方位,re,print,import
From: https://www.cnblogs.com/huaweiyun/p/18072384

相关文章

  • Android14音频进阶:生产者与消费者模型(六十二)
    简介:CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!优质专栏:Audio工程师进阶系列【原创干货持续更新中……】......
  • Git进阶命令-reset
    之前有关Git,写过一片文章:Git五个常见问题及解决方法一、reset命令使用场景有时候我们提交了一些错误的或者不完善的代码,需要回退到之前的某个稳定的版本,面对这种情况有两种解决方法:解决方法1:修改错误内容,再次commit一次解决方法2:使用gitreset命令撤销这一次错误的commi......
  • Java 异常处理与正则表达式详解,实例演练及最佳实践
    Java异常-Try...Catch在Java代码执行期间,可能会发生各种错误,包括程序员编码错误、用户输入错误以及其他不可预料的状况。当错误发生时,Java通常会停止并生成错误消息,这个过程称为抛出异常。try...catch语句try语句允许您定义一段代码块,并在其中测试是否发生错误。catc......
  • 操作符进阶
    补充操作符:1.加减乘除后赋值:+=,-=,=,/=直接上强度,四个操作符一起讲。#include<stdio.h>intmain(){ inta=10; a+=10;//和a=a+10一样 a-=5;//和a=a-10一样 a*=3;//和a=a*10一样 a/=5;//和a=a/10一样 printf("%d",a);}为了分析代码方便直接上注释了分析代码:a=10,操作......
  • 【Django进阶】djangorestframework-jwt使用
    【Django进阶】djangorestframework-jwt使用  简介Jsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者......
  • 代码随想录算法训练营第四十五天 | 279.完全平方数,322. 零钱兑换,70. 爬楼梯 (进阶)
    57.爬楼梯(第八期模拟笔试)时间限制:1.000S空间限制:128MB题目描述假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬至多m(1<=m<n)个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定n是一个正整数。输入描述输入共一行,包含两个正整数,分......
  • 数据结构进阶
    区间数颜色LOJ#3751.[SDOI2009]HH的项链给定长度为\(n\)的序列,\(m\)次询问\([l,r]\)内有多少不同的元素。\(n\le5\times10^4\),\(m\le2\times10^5\)。区间数颜色是莫队算法的经典应用,可以用莫队在\(\Theta(m\sqrtn)\)内解决。P1972[SDOI2009]HH的项链(数据加......
  • 代码随想录算法训练营第四十五天| ● 70. 爬楼梯 (进阶) ● 322. 零钱兑换 ● 279.完全
    爬楼梯 (进阶)题目链接:57.爬楼梯(第八期模拟笔试)(kamacoder.com)思路:笑嘻了,直接给默写出来了。#include<bits/stdc++.h>usingnamespacestd;intmain(){intn,m;cin>>n>>m;vector<int>dp(n+1);dp[0]=1;for(inti=1;i<=n;i++){for(in......
  • Prompt进阶3:LangGPT(构建高性能质量Prompt策略和技巧2)--稳定高质量文案生成器
    Prompt进阶3:LangGPT(构建高性能质量Prompt策略和技巧2)--稳定高质量文案生成器1.LangGPT介绍现有Prompt创建方法有如下缺点:缺乏系统性:大多是细碎的规则,技巧,严重依赖个人经验缺乏灵活性:对他人分享的优质prompt进行调整需要直接修改prompt内容缺乏交互友好性:优质promp......
  • 正则表达式 特殊字符
    正则表达式特殊字符匹配所有键盘上可见的非字母和数字的符号varpatrn=/[`~!@#$%^&*()_\-+=<>?:"{}|,.\/;'\\[\]·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘',。、]/im;  if(!patrn.test(str)){//如果包含特殊字符返回false    returnfalse;  }  returntru......