转载:10个Python正则表达式文本搜索和替换技巧
正则表达式(Regex)是处理文本的强大工具,尤其在Python中,通过re
模块,我们可以灵活地进行搜索、匹配、替换等操作。下面,我们将深入浅出地介绍20个实用的Python正则表达式技巧,适合初学者逐步掌握,直到能够自信地运用到实际项目中。
基本匹配与搜索
技巧1:简单字符匹配
import retext = "Hello, World!"
match = re.search(r"World", text)
if match:print("Found:", match.group()) # Output: Found: World
- 解释 : 使用
r
前缀表示原始字符串,避免转义问题。这里查找"World"并打印。
特殊字符与范围
技巧2:匹配数字
import retext = "123 is a 6number"
match = re.findall(r"\d+", text)
print(match) # ['123', '6']
- \d : 匹配数字。
技巧3:匹配字母
import retext = "123 is a 6 number"
match = re.findall(r"\w+", text)
print(match) # ['123', 'is', 'a', '6', 'number']
- \w : 匹配字母或数字
+
表示前面的字符(\w
)至少出现一次。
位置匹配
技巧4:匹配行首
import retext = "Start here\nNext line"
match = re.match(r"^Start", text, re.MULTILINE)
if match:print("Line starts with 'Start'") # Line starts with 'Start'
^
: 行首匹配,配合re.MULTILINE
可以匹配多行的行首。
匹配行尾
import retext = "Start here\nNext end"
match = re.search(r"end$", text, re.MULTILINE)
if match:print("Line ends with 'end'") # Line ends with 'end'
$
: 行尾匹配。
重复与选择
技巧6:重复匹配
import retext = "aaabbcaadaaaa"
match = re.findall(r"a{2,3}", text)
print(match) # ['aaa', 'aa', 'aaa']
{m,n}
: 匹配前一个字符m到n次。
技巧7:或运算
import retext = "aacatcaadogaaa"
match = re.findall(r"cat|dog", text)
print(match) # ['cat', 'dog']
|
: 匹配左边或右边的表达式。
分组与 捕获
技巧8:分组匹配
import retext = "John Doe, john@example.com"
email = re.search(r"(\w+)@(\w+\.\w+)", text)
print(email.groups()) # ('john', 'example.com')
- 使用括号
()
定义分组。
技巧9:反向引用
import retext = "John Doe, john@example.com"
email = re.search(r"(\w+)@(\w+\.\w+)", text)
# group 方法用于获取匹配对象中的特定部分。group(0) 返回整个匹配的字符串,而 group(1) 返回第一个括号捕获组中的内容,group(2) 返回第二个括号捕获组中的内容,以此类推。
replacement = email.group(1).upper() + "@same.com"
# re.sub是Python正则表达式模块re中的一个函数,用于替换字符串中的匹配项。
new_text = re.sub(email.re, replacement, text)
print(new_text) # John Doe, JOHN@same.com
\数字
: 引用前面的分组。
非贪婪匹配
技巧10:非贪婪匹配
import retext = "<tag>Some 111 content</tag>"
match = re.search(r"<tag>.*?</tag>", text, re.DOTALL)
print(match.group()) # <tag>Some 111 content</tag>
?
在*
、+
后变为非贪婪匹配。
预查与否定预查
技巧11:正向预查
import retext = "startmiddle end"
match = re.findall(r"start(?=middle)", text)
print(match) # ['start']
(?=...)
: 正向预查,后面必须有...但不包括在匹配结果中。
技巧12:否定预查
import retext = "start middle end"
# 这是一个负向前瞻,表示在"start"后面不能紧跟着"middle"。
match = re.findall(r"start(?!middle)", text)
print(match) # ['start']
- 负向前瞻:负向前瞻(?!)用于匹配某个位置后面不能是某个特定模式,但不会消耗字符,即匹配结果中不会包含前瞻中的内容。
替换操作
技巧13:简单替换
import retext = "start world end"
new_text = re.sub(r"world", "universe", text)
print(new_text) # start universe end
- 使用
re.sub
进行替换操作。
技巧14:使用函数进行动态替换
import re# replace_func 是一个回调函数,用于处理每个匹配到的单词。
def replace_func(match):return match.group().upper()text = "start world end"
# 正则表达式 \b\w+\b 用于匹配单词,其中 \b 表示单词边界,\w+ 表示一个或多个字母数字字符。
new_text = re.sub(r"\b\w+\b", replace_func, text)
print(new_text) # START WORLD END
re.sub
的第二个参数可以是一个函数,根据匹配对象动态生成替换内容。
全局匹配和遍历
技巧15:全局匹配
import retext = "start world end"
matches = re.finditer(r"\w+", text)
for match in matches:print(match.group())
# start
# world
# end
- 使用
finditer
获取所有匹配的迭代器。
编译正则表达式
技巧16:编译正则表达式
import retext = "start 12 e2d"
pattern = re.compile(r"\d+")
matches = pattern.findall(text)
print(matches) # ['12', '2']
- 提高重复使用的正则表达式的效率。