- 了解正则表达式语法
正则表达式是由一系列特殊符号和普通字符组成的字符串,用于匹配、查找、替换文本中符合特定规则的内容。在使用正则表达式前,需要先了解正则表达式语法。
- 导入re模块
Python中提供了re模块,它包含一系列正则表达式操作函数。在使用正则表达式前,需要先导入re模块。
import re
- 使用match函数匹配字符串开头
match函数是最简单的正则表达式函数之一,用于匹配字符串开头。它会在字符串开头查找是否匹配指定的正则表达式,如果匹配成功则返回匹配对象,否则返回None。
import re
text = 'hello world!'
pattern = r'hello'
result = re.match(pattern, text)
if result:
print(result.group())
else:
print('no match')
输出结果:
hello
- 使用search函数查找字符串中的匹配
search函数可以在整个字符串中查找匹配,一旦找到第一个匹配,就返回匹配对象。如果没有找到匹配,就返回None。
import re
text = 'hello world!'
pattern = r'world'
result = re.search(pattern, text)
if result:
print(result.group())
else:
print('no match')
输出结果:
world
- 使用findall函数查找所有匹配
findall函数可以查找整个字符串中所有匹配的子字符串,并以列表形式返回。如果没有找到匹配,就返回一个空列表。
import re
text = 'hello world!'
pattern = r'l'
result = re.findall(pattern, text)
print(result)
输出结果:
['l', 'l', 'l']
- 使用sub函数进行字符串替换
sub函数可以用于在字符串中查找匹配,并用指定字符串替换匹配部分。它接受三个参数:要查找的正则表达式、用于替换的字符串和要操作的字符串。如果没有找到匹配,就返回原始字符串。
import re
text = 'hello world!'
pattern = r'world'
replace_str = 'Python'
result = re.sub(pattern, replace_str, text)
print(result)
输出结果:
hello Python!
- 使用compile函数缓存正则表达式
compile函数可以将正则表达式编译成一个模式对象,并可复用该模式。这样可以提高内部效率,并减少程序运行时间。重复使用正则表达式时,通常会使用compile函数。
import re
text = 'hello world!'
pattern = r'world'
replace_str = 'Python'
regex = re.compile(pattern)
result = regex.sub(replace_str, text)
print(result)
输出结果:
hello Python!
- 使用group函数获取匹配子串
group函数可以用于获取匹配的子串。如果正则表达式包含一个或多个子组,group函数还可以返回每个子组匹配的子串。
import re
text = 'first middle last'
pattern = r'(\w+)\s(\w+)\s(\w+)'
result = re.search(pattern, text)
if result:
print(result.group(0)) # 匹配整个字符串
print(result.group(1)) # 匹配第一个子组
print(result.group(2)) # 匹配第二个子组
print(result.group(3)) # 匹配第三个子组
print(result.groups()) # 返回所有子组匹配的子串
输出结果:
first middle last
first
middle
last
('first', 'middle', 'last')
- 使用贪心和非贪心匹配
默认情况下,正则表达式匹配时会采用贪心策略,尽可能地匹配更多的字符。如果需要进行非贪心匹配,可以使用 “?” 符号。
import re
text = 'abaabaaab'
pattern = r'a.*b' # 贪心匹配
result = re.findall(pattern, text)
print(result)
pattern = r'a.*?b' # 非贪心匹配
result = re.findall(pattern, text)
print(result)
输出结果:
['abaabaaab']
['ab', 'aab', 'aaab']
- 使用match对象
match对象是re模块匹配函数返回的对象,它包含了匹配的信息和方法。match对象可以用于访问匹配的字符串、位置和子组等信息。
import re
text = 'first middle last'
pattern = r'(\w+)\s(\w+)\s(\w+)'
result = re.search(pattern, text)
if result:
print(result.string) # 匹配的字符串
print(result.re.pattern) # 正则表达式
print(result.span()) # 返回匹配子串的起始和结束位置
print(result.start()) # 返回匹配子串的起始位置
print(result.end()) # 返回匹配子串的结束位置
输出结果:
first middle last
(\w+)\s(\w+)\s(\w+)
(0, 15)
0
15
- 使用lookahead和lookbehind断言
lookahead和lookbehind是零宽度断言,它们可以在不匹配字符的情况下,断言后面或前面的字符是否匹配。
import re
text = 'python Java php'
pattern = r'\w+(?=\sJava)' # 匹配在单词Java之前的单词
result = re.findall(pattern, text)
print(result)
pattern = r'(?<=python\s)\w+' # 匹配在单词python之后的单词
result = re.findall(pattern, text)
print(result)
输出结果:
['python']
['Java']
- 使用re模块中的finditer函数
finditer函数返回一个匹配对象迭代器,通过迭代器可以依次访问所有匹配的结果。与findall的区别是,finditer返回的是一个迭代器对象,而findall返回的是一个列表。
import re
text = 'first1 second2 third3'
pattern = r'\w+\d'
result = re.finditer(pattern, text)
for match in result:
print(match.group())
输出结果:
first1
second2
third3
以上是Python正则表达式的使用方法,掌握这些技巧可以更加灵活地使用正则表达式来解决问题。