1. 了解正则表达式语法

正则表达式是由一系列特殊符号和普通字符组成的字符串,用于匹配、查找、替换文本中符合特定规则的内容。在使用正则表达式前,需要先了解正则表达式语法。

  1. 导入re模块

Python中提供了re模块,它包含一系列正则表达式操作函数。在使用正则表达式前,需要先导入re模块。

import re
  1. 使用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
  1. 使用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
  1. 使用findall函数查找所有匹配

findall函数可以查找整个字符串中所有匹配的子字符串,并以列表形式返回。如果没有找到匹配,就返回一个空列表。

import re

text = 'hello world!'
pattern = r'l'

result = re.findall(pattern, text)
print(result)

输出结果:

['l', 'l', 'l']
  1. 使用sub函数进行字符串替换

sub函数可以用于在字符串中查找匹配,并用指定字符串替换匹配部分。它接受三个参数:要查找的正则表达式、用于替换的字符串和要操作的字符串。如果没有找到匹配,就返回原始字符串。

import re

text = 'hello world!'
pattern = r'world'
replace_str = 'Python'

result = re.sub(pattern, replace_str, text)
print(result)

输出结果:

hello Python!
  1. 使用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!
  1. 使用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')
  1. 使用贪心和非贪心匹配

默认情况下,正则表达式匹配时会采用贪心策略,尽可能地匹配更多的字符。如果需要进行非贪心匹配,可以使用 “?” 符号。

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']
  1. 使用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
  1. 使用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']
  1. 使用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正则表达式的使用方法,掌握这些技巧可以更加灵活地使用正则表达式来解决问题。