【问题标题】:Why does my regex not work on input from file.read()?为什么我的正则表达式不适用于来自 file.read() 的输入?
【发布时间】:2011-09-05 21:39:00
【问题描述】:

我需要从多个文件中删除一段代码,这些文件的开头如下:

<?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'

我可以确认最后一个代码中的“文本”实际上是一个字符串,并且确实包含问题代码,但是 removeInsert() 代码似乎不适用于这个字符串。我最好的猜测是它与我在手动将字符串输入到 removeInsert() 时所做的三重引号有关。也许 fileRW() 传递给 removeInsert() 的文本不是三引号(我尝试了不同的方法来强制它使用三引号(添加了“\”\“\”“),但这不起作用) 。不过,我不知道如何解决这个问题,并且在我的谷歌搜索中找不到任何关于它的信息。有什么建议吗?

【问题讨论】:

    标签: python regex string file-io quotes


    【解决方案1】:

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

    【讨论】:

    • 谢谢!那解决了它。我原以为可能存在换行问题,但想不出它会是什么样子。
    【解决方案2】:

    在您的正则表达式中保留\n 并以以下方式打开文件:

    input_file= open(filename, 'rU')
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      相关资源
      最近更新 更多