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

时间:2011-06-01 00:18:34

标签: python regex string file-io quotes

我有一段代码需要从多个文件中删除,如下所示:

<?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(“”“[file text]”“”)调用它时,这个程序工作得很好 - 三重引号允许它作为多行读入。

我试图扩展它来打开一个文件并将文件的字符串内容传递给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()的文本不是三引号(我尝试了不同的方法强制它有三引号(“\”\“\”“添加”),但这不起作用)我不知道如何解决这个问题,但在谷歌搜索中找不到任何相关信息。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您的正则表达式仅使用\n作为行。您的文本编辑器可能会插入回车符和换行符组合:\r\n。尝试将正则表达式中的\n更改为(\r\n|\r|\n)

答案 1 :(得分:0)

\n保留在正则表达式中,然后将文件打开为:

input_file= open(filename, 'rU')

注意模式中的extra U。这将允许您的代码即使在其他操作系统上使用,也可以使用具有“外部”行尾的文件。