在Python中显示{}内的行

时间:2014-06-28 00:30:19

标签: python

我需要使用Python在“{}”的List A内打印行。我正在读出这些行并搜索字符串List A,但我不确定如何只显示{}中的行。

示例:

  List A
  {
    name,
    place,
    animal,
    thing
  }

 List B
 {
    Cat,
    Dog,
 }

更新:我尝试了打印(re.compile('List A \ n \ {\ n(。*)\ n \}',re.MULTILINE | re.DOTALL)       .search(s).groups()[0])提到但它没有用。给我找不到错误组。

我试图找到字符串“List B”,但该dint工作。我在下面粘贴了我的代码。

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个格式相同,但格式相同。谢谢你的帮助!!!

3 个答案:

答案 0 :(得分:1)

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

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)

答案 1 :(得分:-1)

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

答案 2 :(得分:-1)

你从包含文本的字符串input_str开始,然后使用正则表达式应该很快:

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

给出

name,
place,
animal,
thing

您可以在正则表达式中看到文本的结构(\n是换行符)。 .*?\n\}匹配所有内容(.*表示任意数量的任意字符,包括换行符,感谢DOTALL)...但是只要遇到就停止 em>第一个结束括号(感谢?)。 \s*表示不同数量的空格(因为问题中的大括号并不总是精确地在行开始)。

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