我正在读取文件并将其内容存储为多行字符串。然后我循环遍历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。不确定这是否重要?无论如何,我工作了几个小时后,我开始从桌子上掉下来,所以任何帮助都表示赞赏。干杯!
答案 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中使用原始字符串文字声明正则表达式模式更安全(并且在其他语言中也使用相应的符号)。