在Python中显示{}内的行

在Python中显示{}内的行,python,Python,我需要使用Python打印列表{}中的行。我正在读取行并搜索字符串列表A,但我不确定如何仅显示{}中的行 例如: List A { name, place, animal, thing } List B { Cat, Dog, } 更新:我尝试了printre.compile'List A\n\{\n.*\n\},re.MULTILINE | re.DOTALL .searchs.groups[0]已提到,但它不起作用。给我找

我需要使用Python打印列表{}中的行。我正在读取行并搜索字符串列表A,但我不确定如何仅显示{}中的行

例如:

  List A
  {
    name,
    place,
    animal,
    thing
  }

 List B
 {
    Cat,
    Dog,
 }
更新:我尝试了printre.compile'List A\n\{\n.*\n\},re.MULTILINE | re.DOTALL .searchs.groups[0]已提到,但它不起作用。给我找不到错误组

我试图找到字符串列表B,但也没用。我已将代码粘贴到下面

import sys
input_file = open(r'path/input.txt') 
Output_file = open('path/output.txt','w')
input_file_read = input_file.read()
for line in str(input_file_read):
    output_file.write(line)
    if line == "List B":
        next(line)
        print line 
input_file_read是为读取而打开的输入文件,output_file是为写入输出而打开的输出文件

问题:有人能告诉我为什么if语句不搜索字符串吗??如何在众多列表中搜索列表B??我只给出了一个输入文件的示例,但在这30个文件中有许多相同格式的列表。谢谢你的帮助

import re

s = """
List A
{
name,
place,
animal,
thing
}
"""

print(re.compile('List A\\n\\{\n(.*)\\n\\}', re.MULTILINE | re.DOTALL)
      .search(s).groups()[0])
输出:

name,
place,
animal,
thing

处理任何列表名称的更通用示例:

import re
s = ''  # Put your content into s
for match in re.finditer(r'List\s+(\w+)\s*\{(.*?)\}', s, re.DOTALL)
    print '-------New List--------'
    print 'Name of List:', m.group(1)
    print 'Content of List:', m.group(2)

如果从包含文本的字符串输入开始,那么使用正则表达式应该很快:

re.search(r'List A\n\s*\{\n(.*?)\n\s*\}', input_str, re.DOTALL).group(1)
给予

您可以在正则表达式中看到文本的结构\n是换行符。.*?\n\}匹配所有内容。*表示任意数量的任意字符,包括换行符,这要归功于DOTALL…但在遇到第一个右大括号时停止,这要归功于?。\s*表示不同数量的空格,因为问题中的大括号并不总是正好位于行的开头


如果您从一个文件开始,如您的示例中所示,那么上面的解决方案可以与input_str=input_file.read一起使用,但这有点浪费,因为这会不必要地读取组中的列表。因此,另一种可能性是逐行读取文件,并使用有限自动机动态地开始和停止收集数据。但是,除非使用外部解析模块,否则这似乎并不方便。因此,如果您的文件不是太大,我认为上面的正则表达式解决方案是合适的。

1读取列表A后的下一行并跳过它,2读取下一行,如果不是}然后打印它,否则转到4,3返回2,4结尾。我上面给出的行在一个文件输入文件中。我的脚本应该读取这些行,并显示{后面和}前面的行,所以每一行都在单独的行上?是的。它们在单独的行上这不是一个坏主意,但是…当列表a后面有更多的右大括号时,这会失败。而且,多行没有理由出现在这里。此外,搜索前编译也没有用。最后,使用原始字符串会更容易。我的答案基本上是这个好主意的工作和改进版本这还不错,但在类似于列表B和列表a{…}的文本中失败。不过,这可能不是一个真实的案例,所以没有否决票然而,这个循环绝对不是一个好的样式:它应该只针对匹配中的m。你可以用[^\n]+替换\w+,来解决列表B列表a{…}的问题,不?@EOL非常感谢你们!!!它起作用了。。。我用[^\n]+替换了\w+,因为以前它返回了文件中的所有列表。
name,
place,
animal,
thing