为什么我的正则表达式不适用于来自file.read的输入?

问题描述

| 我有一段代码需要从多个文件删除,该文件的开头是这样的:
<?PHP
//{{56541616
这样结束:
//}}18420732
?>
其中两个数字字符串都可以是字母和数字的任意序列(不相同)。 我编写了一个Python程序,该程序将返回除此问题字符串之外的整个输入字符串:
def removeInsert(text):
    m = re.search(r\"<\\?PHP\\n\\/\\/\\{\\{[a-zA-Z0-9]{8}.*\\/\\/\\}\\}[a-zA-Z0-9]{8}\\n\\?>\",text,re.DOTALL)
    return text[:m.start()] + text[m.end():]
当我使用removeInsert(\“ \” \“ [文件文本] \” \“ \”)调用该程序时,它的效果很好–三重引号允许将其作为多行读取。 我试图将其扩展为打开文件,并将文件的字符串内容与此传递给removeInsert():
def fileRW(filename):
    input_file = open(filename,\'r\')
    text = input_file.read()
    newText = removeInsert(text)
    ...
但是,当我运行fileRW([input-file])时,出现此错误
return text[:m.start()] + text[m.end():]
AttributeError: \'nonetype\' object has no attribute \'start\'
我可以确认最后一个代码中的\“ text \”实际上是一个字符串,并且确实包含问题代码,但是似乎removeInsert()代码不适用于此字符串。我最好的猜测是,它与将字符串手动输入到removeInsert()中时的三重引号有关。也许fileRW()传递给removeInsert()的文本未用三引号引起来(我尝试过不同的方式来强制它具有三引号(\“ \\\” \\\“ \\\\” \“ ),但这不起作用)。不过,我不知道如何解决此问题,也无法在Google搜索中找到有关此信息的任何信息。     

解决方法

        您的正则表达式仅对行使用ѭ5lines。您的文本编辑器可能会插入回车符和换行符:
\\r\\n
。尝试将正则表达式中的
\\n
更改为
(\\r\\n|\\r|\\n)
。     ,        将ѭ5保留在正则表达式中,并按以下方式打开文件:
input_file= open(filename,\'rU\')
请注意模式中的额外U。这将使您的代码即使在其他操作系统上使用或给定的具有“外来”行尾的文件时也能正常工作。