python的re模块在使用正则匹配时,一个*引起的bug

2017-06-29  本文已影响0人  吃栗子夫斯基波娃

废话不多说,先贴代码:

derivedDataPath = "/Users/dabao/Library/Developer/Xcode/DerivedData"

allfile = os.listdir(derivedDataPath)

baiduBoxAppDir = ""

pattern = r'BaiduBoxApp-.*'

for one in allfile:

    print re.search(pattern, one)

    if(re.search(pattern, one)):

        print "Match!"

        baiduBoxAppDir = one

        break

    else:

        print "Not Match: "+one

print "BaiduBoxAppDir = "+baiduBoxAppDir

然后文件夹里明明有一个“BaiduBoxApp-后面一堆字母”的文件夹,就是匹配不出来。

原因如下:

这里使用的是re.search,re.search 扫描整个字符串并返回第一个成功的匹配。

re还有一个方法是re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

这里我写的pattern = r'BaiduBoxApp-.*',是针对match写的,如果方法换成match,那会匹配成功,但如果是search,后面那个.*就要去掉才能匹配到,因为.*本意是匹配任意字符0或多次,也就是随便是啥,但是search本身就是局部匹配,也就是在一串字符串中寻找子串,那前提必须是这个子串至少长度是确定的,不然怎么局部匹配?哪怕是留着.表示任意一个字符,也是可以匹配到的。

就酱,记录。

上一篇 下一篇

猜你喜欢

热点阅读