目录
1.正则表达式是什么?
正则表达式是用于匹配字符串中的模式的表达式。它是一种强大的工具,可以用于搜索、替换和验证文本中的字符串。
2.正则表达式中的特殊字符含义
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
. | 匹配任意字符 |
[] | 匹配字符集合 |
[^] | 匹配不在字符集合中的字符 |
* | 匹配前面的字符零次或多次 |
+ | 匹配前面的字符一次或多次 |
? | 匹配前面的字符零次或一次 |
{n} | 匹配前面的字符恰好n次 |
{n,} | 匹配前面的字符至少n次 |
{n,m} | 匹配前面的字符至少n次,但不超过m次 |
\ | 转义字符,用于匹配特殊字符 |
3.常用函数及其用法
(1) re.match函数:从字符串的开头匹配正则表达式,如果匹配成功返回一个匹配对象,否则返回None。
示例代码:
import re
str1 = "Hello, world!"
pattern = "^Hello"
result = re.match(pattern, str1)
if result:
print("Matched!")
else:
print("Not matched!")
输出结果为:Matched!
(2) re.search函数:在整个字符串中搜索正则表达式,如果匹配成功返回一个匹配对象,否则返回None。
示例代码:
import re
str1 = "Hello, world!"
pattern = "world$"
result = re.search(pattern, str1)
if result:
print("Matched!")
else:
print("Not matched!")
输出结果为:Matched!
(3) re.findall函数:搜索整个字符串,返回所有匹配的字符串列表。
示例代码:
import re
str1 = "Hello, world!"
pattern = "\w+"
result = re.findall(pattern, str1)
print(result)
输出结果为:['Hello', 'world']
(4) re.sub函数:替换字符串中的匹配项。
示例代码:
import re
str1 = "Hello, world!"
pattern = "\s"
result = re.sub(pattern, "-", str1)
print(result)
输出结果为:Hello,-world!
4.特殊字符用法
^:匹配字符串的开头
示例代码:
import re
str1 = "Hello, world!"
pattern = "^Hello"
result = re.match(pattern, str1)
if result:
print("Matched!")
else:
print("Not matched!")
输出结果为:Matched!
$:匹配字符串的结尾
示例代码:
import re
str1 = "Hello, world!"
pattern = "world$"
result = re.search(pattern, str1)
if result:
print("Matched!")
else:
print("Not matched!")
输出结果为:Matched!
.:匹配任意字符
示例代码:
import re
str1 = "apple, orange, banana"
pattern = "a..le"
result = re.findall(pattern, str1)
print(result)
输出结果为:['apple']
[]:匹配字符集合
示例代码:
import re
str1 = "apple, orange, banana"
pattern = "[ao]"
result = re.findall(pattern, str1)
print(result)
输出结果为:['a', 'o', 'a', 'a']
[^]:匹配不在字符集合中的字符
示例代码:
import re
str1 = "apple, orange, banana"
pattern = "[^ao]"
result = re.findall(pattern, str1)
print(result)
输出结果为:['p', 'l', 'e', ',', ' ', 'r', 'n', 'g', ',', ' ', 'b', 'n']
*:匹配前面的字符零次或多次
示例代码:
import re
str1 = "apple, orange, banana"
pattern = "ap.*e"
result = re.findall(pattern, str1)
print(result)
输出结果为:['apple']
+:匹配前面的字符一次或多次
示例代码:
import re
str1 = "apple, orange, banana"
pattern = "a.+e"
result = re.findall(pattern, str1)
print(result)
输出结果为:['apple']
?:匹配前面的字符零次或一次
示例代码:
import re
str1 = "apple, orange, banana"
pattern = "ap.?e"
result = re.findall(pattern, str1)
print(result)
输出结果为:['apple']
{n}:匹配前面的字符恰好n次
示例代码:
import re
str1 = "apple, orange, banana"
pattern = "a.{2}e"
result = re.findall(pattern, str1)
print(result)
输出结果为:['apple']
{n,}:匹配前面的字符至少n次
示例代码:
import re
str1 = "apple, orange, banana"
pattern = "a.{2,}e"
result = re.findall(pattern, str1)
print(result)
输出结果为:['apple']
{n,m}:匹配前面的字符至少n次,但不超过m次
示例代码:
import re
str1 = "apple, orange, banana"
pattern = "a.{1,2}e"
result = re.findall(pattern, str1)
print(result)
输出结果为:['apple']
\:转义字符,用于匹配特殊字符
示例代码:
import re
str1 = "apple, orange, banana"
pattern = "\."
result = re.findall(pattern, str1)
print(result)
输出结果为:['.', '.']
5.正则表达式的高级用法
(1) 分组和引用
可以使用圆括号来分组,并使用\1、\2等来引用分组。
示例代码:
import re
str1 = "apple apple apple orange orange"
pattern = r"(\w+) \1 \1 (\w+) \2"
result = re.search(pattern, str1)
if result:
print("Matched!")
else:
print("Not matched!")
输出结果为:Matched!
(2) 零宽度断言
零宽度断言用于匹配一个位置,而不是匹配一个字符。常用的零宽度断言有:正向先行断言(?=)、正向后行断言(?<=)、负向先行断言(?!)、负向后行断言(?<!)。
示例代码:
import re
str1 = "apple123orange"
pattern = r"\d+(?=orange)"
result = re.search(pattern, str1)
if result:
print("Matched!")
else:
print("Not matched!")
输出结果为:Matched!
(3) 非贪婪匹配
默认情况下,正则表达式会尽可能匹配最长的字符串。可以使用?来实现非贪婪匹配。
示例代码:
import re
str1 = "<h1>title1</h1><h2>title2</h2>"
pattern = r"<.+?>"
result = re.findall(pattern, str1)
print(result)
输出结果为:['<h1>', '</h1>', '<h2>', '</h2>']
正则表达式默认是贪婪匹配,即会尽可能匹配最长的字符串。例如,对于字符串"123456",正则表达式"\d+"会匹配整个字符串,而不是只匹配"123"。
如果需要使用贪婪匹配,可以在正则表达式中使用"?"来实现。例如,将正则表达式"\d+?"应用于字符串"123456",则只会匹配"1"。