如何用python实现正则表达式中的“非贪婪”匹配

2022-06-13 09:39:59

在python的正则表达式中,操作符有“贪婪”和“非贪婪”之分,对于“贪婪操作符”,匹配过程是贪婪的,简单地说,就是需要尽可能匹配更多的字符串,因此,当存在某个字符串满足匹配条件时,立马匹配,这就意味着,存在如果这个字符串再多一些字符也可以匹配但是不会被匹配的情况。比如,我们对一个txt文件中的数据进行正则匹配,数据如下:

Sun May 10 04:42:56 2076::gugq@zmworxj.com::3356282576-4-7
Mon Oct 17 19:53:06 2101::xuej@owqqxevkxep.edu::4158993186-4-11
Fri Mar  8 01:25:34 2069::oesoe@keioku.edu::3129902734-5-6
Thu Jun 29 16:07:01 2051::rqfwte@zoxflwgznjhj.com::2571638821-6-12
Wed May 12 18:26:06 2077::mugsnp@ctbxkrdw.edu::3388040766-6-8
Thu Jul 12 07:36:10 2012::xwooi@xhjreu.edu::1342049770-5-6
Thu Jan 26 14:54:06 2006::dwuj@fqixh.gov::1138258446-4-5
Sat Jul  3 11:27:27 2083::slalaq@wgfcjpjcwfvc.net::3581810847-6-12
Tue Jul 31 11:28:14 2029::ojkey@sqdgktbhfjkk.net::1880162894-5-12

这是一个随机生成的由日期、邮箱以及随机数和长度信息组成的数据,下面,我们要匹配最后的“x-y-z”部分,我们知道,如果需要匹配字符串中的某个字符串,就需要用“search()”而不是“match()”,此外,如果想要获取被匹配字符串中的某一部分,就要用到圆括号()进行分组,因此,我们的匹配模式可以是“.+(\d+-\d+-\d+)”,代码如下(数据所在的文件为data.txt):

import re

f = open('data.txt','r')
for eachLine in f:
    r = re.search('.+(\d+-\d+-\d+)',eachLine)
    print(r.group(1))
f.close()

让我们来看看运行的结果:

    诶诶诶?啥情况?为什么不是“3356282576-4-7”这种?这就是因为,默认的匹配模式是“贪婪”匹配,也就是能匹配就行,能匹配就给我走。这样显然不能满足我们的需求。所以就需要“非贪婪匹配”

    而对于“非贪婪操作符”,需求是正则表达式尽可能少的匹配字符串,因此,如果某个字符串满足匹配的模式,那么就会继续对该字符串的两边进行扩展检测,直到其不能满足为止,这样匹配的字符串的字符个数是尽可能多的。

    注:可以在“贪婪操作符”后面添加“?”,将其转为非贪婪的。

    那么,我们来看看修改为贪婪匹配的代码:

import re

f = open('data.txt','r')
for eachLine in f:
    r = re.search('.+?(\d+-\d+-\d+)',eachLine)
    print(r.group(1))
f.close()

   再来看看运行结果:

    嗯,这就很舒服啦~

  • 作者:Rusty-Trueno
  • 原文链接:https://blog.csdn.net/Kobe_1314/article/details/92406437
    更新时间:2022-06-13 09:39:59