1. 正则表达式介绍
正则表达式(Regular Expression)是一种字符串处理语言,可以用于快速地检索、替换和分割文本。Python 语言内置有 re 模块,可以使用正则表达式。
正则表达式的语法非常复杂,可以匹配特定模式的字符串,包括数字、字母、符号等。在正则表达式中,可以使用*
、?
、+
等特殊符号来表示数量和位置,进而匹配更加复杂的字符串。
import re
text = "The quick brown fox jumps over the lazy dog."
pattern = "fox"
result = re.search(pattern, text)
print(result)
上面的代码使用 Python re 模块中的 search()
函数在字符串中查找指定的模式。
对于上面的代码,可以看到输出结果为 <re.Match object; span=(16, 19), match='fox'>
,表示在字符串中匹配到了模式,匹配的位置是(16, 19),也就是从第 16 个字符开始,长度为 3。
2. 正则表达式语法
2.1 元字符
元字符指的是正则表达式中具有特殊含义的字符,例如 .
、?
、*
等。
.
表示任意字符。
?
表示匹配 zero 或 one 次。
*
表示匹配 zero 或多次。
+
表示匹配 one 或多次。
|
表示“或”。
例如下面的代码可以匹配字符串中的数字:
import re
text = "123abc456"
pattern = r"\d+"
result = re.findall(pattern, text)
print(result)
对于上面的代码,可以看到输出结果为 ['123', '456']
,表示在字符串中匹配到了两个数字。
2.2 字符类
字符类指的是一组可以用来匹配单个字符的字符。能够使用字符类的位置就是在方括号内。
[ABC]
表示匹配 A、B 或 C 中的任何一个。
[A-Z]
表示匹配大写字母(A~Z)中的任何一个。
[a-z]
表示匹配小写字母(a~z)中的任何一个。
[0-9]
表示匹配数字(0~9)中的任何一个。
例如下面的代码可以匹配字符串中的大写字母:
import re
text = "The quick brown fox jumps over the lazy dog."
pattern = r"[A-Z]"
result = re.findall(pattern, text)
print(result)
对于上面的代码,可以看到输出结果为 ['T']
,表示在字符串中匹配到一个大写字母。
2.3 边界匹配
边界匹配指的是匹配输入字符串的边界位置。
^
表示匹配输入字符串的开始位置。
$
表示匹配输入字符串的结束位置。
\b
表示匹配单词的边界。
\B
表示匹配非单词的边界。
例如下面的代码可以匹配字符串中以数字开头的字符串:
import re
text = "123abc456"
pattern = r"^\d"
result = re.findall(pattern, text)
print(result)
对于上面的代码,可以看到输出结果为 ['1']
,表示在字符串开头匹配到了一个数字。
2.4 捕获匹配
捕获匹配指的是使用圆括号来分组匹配指定的字符,可以在后面通过引用组名来获取匹配的内容。
例如下面的代码可以匹配邮箱地址,并将用户名和域名分别进行捕获:
import re
text = "someone@gmail.com"
pattern = r"(\w+)@(\w+)\.com"
result = re.match(pattern, text)
print(result.group(1))
print(result.group(2))
对于上面的代码,可以看到输出结果为 someone
和 gmail
,表示用户名和域名分别被捕获成功。
3. 正则表达式练习
下面提供一些正则表达式练习题,供读者练习。
3.1 匹配 IP 地址
编写一个正则表达式,匹配 IPv4 地址。
import re
pattern = r"^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$"
print(re.match(pattern, "192.168.1.1"))
print(re.match(pattern, "0.0.0.0"))
print(re.match(pattern, "255.255.255.255"))
print(re.match(pattern, "192.168.1.256"))
对于上面的代码,可以看到输出结果为:
<re.Match object; span=(0, 11), match='192.168.1.1'>
<re.Match object; span=(0, 7), match='0.0.0.0'>
<re.Match object; span=(0, 15), match='255.255.255.255'>
None
3.2 匹配 URL
编写一个正则表达式,匹配 URL。
import re
pattern = r"^(?:http|https|ftp)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(?:\/\S*)?$"
print(re.match(pattern, "http://www.baidu.com"))
print(re.match(pattern, "https://www.google.com/"))
print(re.match(pattern, "ftp://ftp.microsoft.com/pub/"))
print(re.match(pattern, "www.google.com"))
对于上面的代码,可以看到输出结果为:
<re.Match object; span=(0, 18), match='http://www.baidu.com'>
<re.Match object; span=(0, 19), match='https://www.google.com/'>
<re.Match object; span=(0, 32), match='ftp://ftp.microsoft.com/pub/'>
None
3.3 匹配 HTML 标签
编写一个正则表达式,匹配 HTML 标签。
import re
pattern = r"<\/?[a-z]+(?:\s*[a-z]+\s*\=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))*\s*>"
print(re.findall(pattern, "Python正则表达式
"))
print(re.findall(pattern, "
Python是一种强大的编程语言。"))
对于上面的代码,可以看到输出结果为:
['<h1>', '</h1>']
["<p class='intro'>", '</p>']
4. 总结
本文主要介绍了 Python 的正则表达式,并给出了一些练习题。读者可以通过本文了解到正则表达式的基本语法和使用方法,从而在实际开发中应用正则表达式来处理字符串。
正则表达式是一项非常复杂和强大的技能,需要不断地练习和实践才能掌握,希望读者能够善加利用,并在实际开发中得到运用。