繁体   English   中英

python正则表达式不匹配文件内容与 re.match 和 re.MULTILINE 标志

[英]python regular expression not matching file contents with re.match and re.MULTILINE flag

我正在读取文件并将其内容存储为多行字符串。 然后我遍历我从 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 regexStringprint 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。 不确定这是否重要? 无论如何,在工作了几个小时后,我的头开始从办公桌上掉下来,因此感谢您的帮助。 干杯!

根据文档, 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 中的原始字符串文字(以及其他语言中的相应符号)声明正则表达式模式更安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM