python正则表达式不匹配文件内容

时间:2015-08-05 21:58:25

标签: python regex django python-2.7

我正在读取文件并将其内容存储为多行字符串。然后我循环遍历django查询中的一些值,以根据查询结果值运行正则表达式。我的正则表达式似乎应该正常工作,并且如果我复制查询返回的值,则可以正常工作,但由于某些原因,当所有部分一起工作时,这些结果并不匹配

我的代码是:

with open("/path_to_my_file") as myfile:
    data=myfile.read()

#read saved settings then write/overwrite them into the config
items = MyModel.objects.filter(some_id="s100009")
for item in items:
    regexString = "^\s*"+item.feature_key+":"

    print regexString #to verify its what I want it to be, ie debug
    pq = re.compile(regexString, re.M)

    if pq.match(data):
        #do stuff

所以基本上我的问题是正则表达式不匹配。当我将文件内容复制到一个很大的旧字符串中,并复制由print regexString行打印的值时,它确实匹配,所以我认为这是一些深奥的python / django事情(或许不是那么深奥,因为python不是我的第一语言)。

例如,print regexString的输出是:

^\s*productDetailOn:

文件内容:

    productDetailOn:true,
    allOff:false,
    trendingWidgetOn:true,
    trendingWallOn:true,
    searchResultOn:false,
    bannersOn:true,
    homeWidgetOn:true,
}

运行Python 2.7。同时,转储了item.feature和data的类型,两者都是unicode。不确定这是否重要?无论如何,我工作了几个小时后,我开始从桌子上掉下来,所以任何帮助都表示赞赏。干杯!

1 个答案:

答案 0 :(得分:2)

根据文档,re.match从不允许在的开头进行搜索:

  

请注意,即使在MULTILINE模式下,re.match()也只会匹配字符串的开头而不是每行的开头。

您需要使用re.search

regexString = r"^\s*"+item.feature_key+":"
pq = re.compile(regexString, re.M)
if pq.search(data):

关于原始字符串(r"^\s+")的小注释:在这种情况下,它等同于"\s+",因为没有\s转义序列(如\r\n)因此,Python将其视为原始字符串文字。尽管如此,总是在Python中使用原始字符串文字声明正则表达式模式更安全(并且在其他语言中也使用相应的符号)。