python的正则(一):简单够用的basic版
字符集合
[...] 字符集合,[]中的特殊字符表示字符本身
[^...] 字符集合以外的字符
分组匹配
| 或,比如A|B,如果A没匹配到,就匹配B
匹配次数(重复次数)
* 重复大于等于0次
+ 重复大于等于1次
? 重复0次或1次
非贪婪模式
*?
+?
??
默认是贪婪模式,尽可能多的匹配。比如verilog里有很多个begin end块。'begin.*end'是从第一个begin匹配到最后一个end,这往往不是我们想要的。如果我只需要匹配到第一个end,用非贪婪模式'begin.*?end'即可。
1begin
2...
3end
4begin
5...
6end
7begin
8...
9end
引用
(...) 括号中内容可以再后续引用
基本规则介绍完毕。下面介绍几个re模块的函数。
re模块的函数
在Perl中,匹配和替换用下面的语法:
1$str =~ m/.../;
2$str =~ s/.../.../;
re.search
而Python中,由于一切都是对象,我们需要使用re模块中的方法(函数)来实现。在re中有一个search函数,第一个参数是pattern,就是正则,第二个参数是被匹配的字符串。需要注意的是:正则本身也是一个字符串,常使用raw字符串,即r'...',可以避免一些不必要的转义。
1import re
2result = re.search(r'pattern', 'string', option)
如果匹配到了,result.group(0)则是匹配到的字符串;如果没有匹配到,result则为None。所以,可以根据result是不是None来判断是否查找到指定的字符串。例如:
1import re
2s = 'input wire a;input wire b;'
3result = re.search(r'wires+w+;', s)
4print(result.group(0)) # wire a
5if result: # if not result:
6 ...
在正则中加括号()来引用匹配的子字符串,例如下面的一段代码,对verilog信号名a和b加括号,则result.group(1)表示第一个括号匹配的子字符串a,result.group(2)表示第二个括号匹配的子字符串b。而result.group(0)表示匹配的全部字符串。
1import re
2s = 'input wire a;input wire b;'
3result = re.search(r'wires+(w+).*wires(w+)', s, re.S)
4print(result.group(0)) # wire a;input wire b
5print(result.group(1)) # a
6print(result.group(2)) # b
由于原字符串带有换行符,默认.*不能跨越换行符匹配,需要加上re.S的选项才可以。除了re.S还有其它一些常见选项:
re.S 当作单行(Singal line)来匹配
re.M 当作多行(Multi line)来匹配
re.I 忽略(Ignore)大小写
re.sub
正则的主要作用,是进行高级查找和替换,查找是search(),替换就是sub(),如下所示:
1import re
2result = re.sub(r'pattern', r'replace', 'string', count=0, option)
在'string'中查找'pattern',并替换成'replace';
replace为空字符串''时,等同于删除;
count指定替换的次数,默认0是全部替换;
option与search中的相同,可以指定单行、多行、大小写等;
返回值是替换后的新字符串,如果没有匹配到,返回老字符串。
最新活动更多
-
即日-1.24立即参与>>> 【限时免费】安森美:Treo 平台带来出色的精密模拟
-
2月28日火热报名中>> 【免费试用】东集技术年终福利——免费试用活动
-
即日-3.21立即报名 >> 【深圳 IEAE】2025 消费新场景创新与实践论坛
-
4日10日立即报名>> OFweek 2025(第十四届)中国机器人产业大会
-
7.30-8.1火热报名中>> 全数会2025(第六届)机器人及智能工厂展
-
即日-2025.8.1立即下载>> 《2024智能制造产业高端化、智能化、绿色化发展蓝皮书》
推荐专题
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论