元字符
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
反义
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意非空白字符
\D 任意非数字字符
\B 任意非单词开头或结束的位置
[^x] 除了x以外的任意字符
[^abcd] 除了abcd这几个字母的任意字符
重复限定符
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
分组
正则表达式中用小括号()来做分组,也就是括号中的内容作为一个整体。
条件或
使用|表示或关系
# 匹配130或者131开头的号码
^(130|131)\d{8}$
贪婪模式
贪婪模式下正则会尽量多的匹配字符
str = '123456'
\d{3,6} 匹配出来的则是‘123456’, 尽管‘123’也满足,但是因为贪婪模式,所以会尽量匹配6.
懒惰模式(非贪婪)
*? 重复任意次,但尽量少重复
+? 重复1次或者多次,尽量少重复
?? 重复0次或1次,尽量少重复
{n, m}? 重复n到m次, 尽量少重复
每项更详细的解释
python 正则官方文档
python正则例子
import re
def run():
test_str = 'int a = 3; int b = 4;'
split_results = re.split('\=|\;', test_str)# |表示=或者\都可以
print(split_results)
match_objs = re.match('.*\=(.*);.*\=(.*)\;', test_str)
if match_objs is not None:
print(match_objs.groups())
test_str = \
'''
LOGD("result is %.3f, interval:(%.3f, %.2f)",
3.5, 0.0, 1.0);
int var = 5;
'''
contens_in_brace = re.match("\t*\s*LOGD\((.*\n*.*)\)\;", test_str).groups()[0]
print(contens_in_brace)
if __name__ == '__main__':
run()
打印结果:
['int a ', ' 3', ' int b ', ' 4', '']
(' 3', ' 4')
"result is %.3f, interval:(%.3f, %.2f)",
3.5, 0.0, 1.0
re.sub
替换字符串.
将def myfunc():
替换为:
static PyObject*
py_myfunc(void)
{
对应python代码:
re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',
r'static PyObject*\npy_\1(void)\n{',
'def myfunc():')
查找并返回一个匹配项的函数有: search、match他们的区别分别是:
-
search: 查找任意位置的匹配项
-
match: 必须从字符串开头匹配
-
re.split
re.split(pattern, string, maxsplit=0, flags=0) 函数:用 pattern 分开 string , maxsplit表示最多进行分割次数, -
替换
替换主要有sub函数 与 subn函数,他们功能类似! 先来看看sub函数的用法: re.sub (pattern, repl, string, count=0, flags=0) 函数参数讲解:repl替换掉string中被pattern匹配的字符, count表示最大替换次数,flags表示正则表达式的常量。 值得注意的是:sub函数中的入参:repl替换内容既可以是字符串,也可以是一个函数哦! 如果repl为函数时,只能有一个入参:Match匹配对象。
vscode中使用正则替换
比如想将python2中的print替换为python3的print语法, 除了用2to3
命令, 也可以使用正则
print 'you are 100 years old'
使用vscode 的replace 命令, 选择正则填写
print\s(\S+)\s*
替换目标为:
print($1)
既可将上面的print代码替换为:
print('you are 100 years old')