Python 删除括号内的文本

Python 删除括号内的文本,python,file,python-3.x,while-loop,readline,Python,File,Python 3.x,While Loop,Readline,我试图写一个程序来清理文本文件;具体来说,我正试图整理莎士比亚的《仲夏夜之梦》。我试图编写一段代码,从脚本中删除舞台方向,因此本文: 忒修斯,去叫猎人们用号角叫醒他们 [鸣笛,呼喊。德米特里厄斯,莱桑德,赫米娅和海伦娜醒了 并启动。] 朋友们,明天好。圣瓦伦丁已经过去;从这些木鸟开始 但现在要结婚了吗 莱桑德:对不起,大人 [他和其他人向忒修斯下跪。] 忒修斯 请大家站起来。我知道你们两个是敌对的敌人;世界上的这种温和的和谐是怎么来的,仇恨是如此的强烈 远离嫉妒,以恨入眠,不怕仇视 成为以下文本

我试图写一个程序来清理文本文件;具体来说,我正试图整理莎士比亚的《仲夏夜之梦》。我试图编写一段代码,从脚本中删除舞台方向,因此本文:

忒修斯,去叫猎人们用号角叫醒他们

[鸣笛,呼喊。德米特里厄斯,莱桑德,赫米娅和海伦娜醒了

并启动。]

朋友们,明天好。圣瓦伦丁已经过去;从这些木鸟开始 但现在要结婚了吗

莱桑德:对不起,大人

[他和其他人向忒修斯下跪。]

忒修斯

请大家站起来。我知道你们两个是敌对的敌人;世界上的这种温和的和谐是怎么来的,仇恨是如此的强烈 远离嫉妒,以恨入眠,不怕仇视

成为以下文本:

忒修斯,去叫猎人们用号角叫醒他们

朋友们,明天好。圣瓦伦丁已经过去;从这些木鸟开始 但现在要结婚了吗

莱桑德:对不起,大人

忒修斯

请大家站起来。我知道你们两个是敌对的敌人;世界上的这种温和的和谐是怎么来的,仇恨是如此的强烈 远离嫉妒,以恨入眠,不怕仇视

这是我写的代码,但是在我假设的while循环中,它被挂起了。任何帮助都将不胜感激

def cleanDirections(inFilename, outFilename):
    inFile = open(inFilename, "r")
    outFile = open(outFilename, "w")

    line = inFile.readline()

    while line != "":

        if line.startswith("[") == True:
            if line.endswith("]") == True:
                line = inFile.readline()
            else:
                while line.endswith("]") == False:
                    line = inFile.readline()
            line = inFile.readline()

        else:
            outFile.write(line)
            line = inFile.readline()

另外:如果可以用这种语法提供帮助,那就太好了。我还在学习,所以我还不知道更高级的python。

因为括号跨越多行,所以不能逐行执行此操作。使用:

text = inFile.readLines()
text = re.sub("\[[^\]]*\]","",text) #will kill any [STUFF]

不使用
re

while "[" in string:
    string=string.replace(string[string.find("["):string.find("]")+1],"")

要做到这一点,您必须将所有文件读取到
string

这里有一个非常简单的方法,可以做很多假设,例如:

  • 只有第一列中的“[”是有效的
  • “[”和“]”不嵌套-只有一层方括号
  • 在“]”后面的一行中没有任何内容(可能除了空格)。“]”后面的任何内容都将丢失
  • 如果你能接受这些:

    inFile = open(inFilename, "r")
    outFile = open(outFilename, "w")
    skipping = False
    for line in infile:
        if skipping:
            # don't print this line no matter what,
            # hut stop skipping if "]" in line
            if "]" in line:
                skipping = False
        elif line.startswith("["):
            # don't print this line either no matter what,
            # and start skipping if "]" _not_ in the line
            skipping = "]" not in line
        else:
            outfile.write(line)
    infile.close()
    outfile.close()
    if skipping:
        raise ValueError("hit end of file with unclosed '['!")
    

    如果你不能忍受这些限制,那么事情就会变得更复杂;-)

    我是python新手,尽管我是以类似C的方式完成这项工作的。这很容易理解:)


    它逐字符解析文件,并在您计数器时设置
    inStageDirections
    [以确保以下文本不会写入新文件。尽管我强烈建议您使用regexp来完成此工作,因为它更快速、更优雅。

    这太完美了!非常感谢!:)您喜欢它,因为它与您的代码非常相似-哈哈;-)但我赞同您在这里避免使用regexp的愿望-它们可能非常强大erful,但也非常模糊。这里的逻辑很容易在没有它们的情况下编码。比使用它们的行要多。这可以使用正则表达式在一行中完成。@Tommy,这段代码和您的1行代码之间有一些语义上的差异。举个重要的例子,这段代码会在包含结束符的行的末尾终止换行符]“-您的regexp 1-liner不需要。很明显,OP不需要“额外”换行代码剩余。另一方面,此代码在没有更改的情况下扩展到太大而无法放入RAM的文件,而1-liner也不能。我将让您去寻找其他差异。简洁性与清晰性不同。如果您不相信这一点,请注意OP实际上理解此代码;-)请注意@Tommy,我确实想学习r的基本知识egex,但目前不想这样做不是“懒惰”,但实用性。我仍在学习python,在学习更复杂的东西之前,掌握我所学和所知道的似乎既实用又有益。我感谢你的帮助,但我从未说过我不想学习基础知识,我只是说在掌握我所知的知识之前我不想学习它们。不过,谢谢你的帮助!
    newFile = open('out.txt', 'w')
    
    inStageDirections = False
    
    with open('sp.txt') as f:
        for c in f.read():
            if inStageDirections is False and c == '[':
                inStageDirections = True
            elif inStageDirections is True and c == ']':
                inStageDirections = False
                continue
    
            if not inStageDirections:
                newFile.write(c)
    
            if inStageDirections:
                pass