正则表达式语法详解(python)
目录
引言
第一部分:正则表达式基础
1. 什么是正则表达式?
2. 正则表达式的组成
3. 正则表达式的执行过程
第二部分:常用正则表达式元字符
1. 点号(.)
2. 星号(*)
3. 加号(+)
4. 问号(?)
5. 花括号({})
6. 方括号([])
7. 脱字符(^)
8. 美元符号($)
第三部分:高级正则表达式技巧
1. 捕获组
2. 反向引用
3. 非捕获组
4. 前瞻断言与后瞻断言
5. 贪婪与非贪婪模式
第四部分:正则表达式实战案例
1. 电子邮件地址验证
2. 电话号码提取
3. HTML标签清理
第五部分:常见错误与陷阱
1. 忘记转义特殊字符
2. 误用量词导致的性能问题
3. 忽略字符编码问题
引言
正则表达式(Regular Expression,简称 regex 或 regexp)是一种强大的文本处理工具,广泛应用于各种编程语言和工具中。无论是用于搜索、替换、验证还是提取特定模式的数据,正则表达式都能提供高效且灵活的解决方案。本文将详细介绍正则表达式的基本概念、常用元字符、高级技巧以及实战案例,帮助读者从入门到精通。
第一部分:正则表达式基础
1. 什么是正则表达式?
正则表达式是一种描述字符串模式的语言。它允许你定义一个模式,然后用这个模式来匹配、查找、替换或验证字符串。正则表达式通常用于文本处理任务,如搜索和替换文本中的特定模式。
2. 正则表达式的组成
.、*、+ 等。*、+、?、{}。^、$、\b。3. 正则表达式的执行过程
正则表达式引擎会从左到右扫描输入字符串,并尝试匹配定义的模式。如果找到匹配项,引擎会返回匹配的结果;否则,返回不匹配的结果。正则表达式引擎支持多种匹配模式,如贪婪匹配和非贪婪匹配。
第二部分:常用正则表达式元字符
1. 点号(.)
a.b 可以匹配 a1b、a b、a$b 等。2. 星号(*)
ab*c 可以匹配 ac、abc、abbc 等。3. 加号(+)
ab+c 可以匹配 abc、abbc、abbbc 等。4. 问号(?)
ab?c 可以匹配 ac、abc。5. 花括号({})
a{2,4} 可以匹配 aa、aaa、aaaa。6. 方括号([])
[abc] 可以匹配 a、b、c。7. 脱字符(^)
[^abc] 可以匹配除 a、b、c 以外的任何字符;^abc 表示以 abc 开头的字符串。8. 美元符号($)
abc$ 表示以 abc 结尾的字符串。第三部分:高级正则表达式技巧
1. 捕获组
() 创建捕获组,可以提取匹配的部分。(ab)c 可以匹配 abc,并且捕获组会捕获 ab。2. 反向引用
\1、\2 等反向引用。(\w+)\1 可以匹配连续两次出现的单词,如 testtest。3. 非捕获组
(?:...) 创建非捕获组,不会被捕获。(?:ab)c 可以匹配 abc,但不会捕获 ab。4. 前瞻断言与后瞻断言
(?=...),匹配后面跟指定模式的字符串。(?!...),匹配后面不跟指定模式的字符串。(?<=...),匹配前面有指定模式的字符串。(?<!...),匹配前面没有指定模式的字符串。abc(?=def) 可以匹配 abc,但前提是后面必须跟着 def。5. 贪婪与非贪婪模式
?,尽可能少地匹配字符。a.*b 贪婪模式匹配 a...b,a.*?b 非贪婪模式匹配 a...b 中的第一个 b。第四部分:正则表达式实战案例
1. 电子邮件地址验证
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$import re
email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
test_emails = ["example@example.com", "invalid-email", "user@domain.co.uk"]
for email in test_emails:
if re.match(email_pattern, email):
print(f"{email} 是有效的电子邮件地址")
else:
print(f"{email} 是无效的电子邮件地址")
2. 电话号码提取
\d{3}-\d{3}-\d{4}import re
phone_pattern = r'\d{3}-\d{3}-\d{4}'
text = "请拨打 123-456-7890 或者 987-654-3210 联系我们。"
phone_numbers = re.findall(phone_pattern, text)
print("提取的电话号码:", phone_numbers)
3. HTML标签清理
<[^>]+>import re
html_pattern = r'<[^>]+>'
text = "<p>这是一个段落。</p><div>这是另一个段落。</div>"
cleaned_text = re.sub(html_pattern, '', text)
print("清理后的文本:", cleaned_text)
第五部分:常见错误与陷阱
1. 忘记转义特殊字符
., *, +, ?, (, ), [, ], {, }, |, \ 需要转义。\ 转义特殊字符。2. 误用量词导致的性能问题
3. 忽略字符编码问题
作者:licy__