【问题标题】:Removing text contained within brackets删除括号内的文本
【发布时间】:2026-01-31 22:20:05
【问题描述】:

我正在尝试编写一个清理文本文件的程序;具体来说,我正在尝试清理莎士比亚的“仲夏夜之梦”的副本。我正在尝试编写一个代码来消除脚本中的舞台方向,以便此文本:

THESEUS 去,吩咐猎人用喇叭叫醒他们。

[喇叭,在里面大喊。德米特里厄斯、拉山德、赫米亚和海伦娜醒了

然后启动。]

早安,朋友们。圣瓦伦丁过去了;开始这些木鸟 但现在要结对了吗?

LYSANDER 对不起,大人。

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

忒修斯

我祈祷你们都站起来。我知道你们两个是敌对的敌人;世间何来这温柔的默契,那恨何以如此 远离嫉妒 怀着仇恨入睡,不惧怕仇恨?

变成这样的文字:

THESEUS 去,吩咐猎人用喇叭叫醒他们。

早安,朋友们。圣瓦伦丁过去了;开始这些木鸟 但现在要结对了吗?

LYSANDER 对不起,大人。

忒修斯

我祈祷你们都站起来。我知道你们两个是敌对的敌人;世间何来这温柔的默契,那恨何以如此 远离嫉妒 怀着仇恨入睡,不惧怕仇恨?

这是我编写的代码,但它在我假设的 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。

【问题讨论】:

    标签: python file python-3.x while-loop readline


    【解决方案1】:

    由于您的括号跨越多行,因此您不能逐行执行此操作。使用:

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

    【讨论】:

      【解决方案2】:

      这是一个非常简单的方法,做了很多假设,比如:

      1. 只有第一列中的“[”有意义。
      2. “[”和“]”不嵌套 - 只有 1 级方括号。
      3. “]”之后的一行中没有任何内容(可能除了空格)。 “]”之后的所有内容都将丢失。

      如果你能忍受这些:

      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 '['!")
      

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

      【讨论】:

      • 这太完美了!太感谢了! :)
      • 你喜欢它,因为它很像你的代码——哈哈 ;-) 但我赞赏你在这里避免使用正则表达式的愿望——它们可能非常强大,但也非常晦涩。没有它们,这里的逻辑很容易编码。
      • 行数比他们多得多。这可以使用正则表达式在一行中完成。
      • @Tommy,此代码与您的 1-liner 之间存在一些语义差异。对于一个重要的示例,此代码在包含结束 ']' 的行末尾终止换行 - 您的 regexp 1-liner 不会。很明显,OP 确实 想要留下“额外的”换行符。另一方面,此代码无需更改太大而无法放入 RAM 的文件即可扩展 - 而 1-liner 也没有。我会把它留给你去寻找其他的不同之处。简洁不等于清晰。如果您不相信,请注意 OP 实际上理解 this 代码 ;-)
      • 请注意@Tommy,我确实想学习正则表达式的基础知识,但目前不想这样做不是“懒惰”,而是实用性。我仍在学习 python,在我开始学习更复杂的东西之前掌握我所学和确实知道的东西似乎既实用又有益。感谢您的帮助,但我从来没有说过我不想学习基础知识,我只是说我不想学习它们直到我掌握了我所知道的。不过感谢您的帮助!
      【解决方案3】:

      不使用re

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

      您必须将所有文件读取到string 才能执行此操作。

      【讨论】:

        【解决方案4】:

        我是 python 新手,虽然我是用 C-Like 的方式做的。很容易理解:)

        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
        

        它逐个字符地解析文件,并在您反击[ 时设置inStageDirections,以确保以下文本不会写入新文件中。虽然我强烈建议您使用正则表达式来完成这项工作,因为它更快、更优雅。

        【讨论】:

          最近更新 更多