【问题标题】:Extracting strings between mutiple lines matching a pattern using python使用python在匹配模式的多行之间提取字符串
【发布时间】:2019-12-10 09:05:15
【问题描述】:

我有一个像这样的文件 [samplefile.txt] -

dummy line 1
dummy line 2
create_list animal -list     
  tiger
create_list bird -list        
  crow
dummy line 3
create_list car -list        
  ford/mustang
dummy line 4
dummy line 5
create_list truck
  -list ford/F150
create_list human -list {
  jack
  john}

我想得到这样的输出 - ['tiger', 'crow', 'ford/mustang', 'ford/F150']

我正在使用的代码 -

import re

def extractListItems(File):
    f = open(File,"r")
    content = f.read()

    list_items = []

    for m in re.finditer(r'(?:\bcreate_list+\s+\S+\s+-list+\s*)((?:\b\S+\b(?:\s*))+)(?:\n)', content):
            list_items.extend(re.split(r'\s+', m.group(1).strip()))

    print (list_items)
    f.close()

extractListItems("samplefile.txt")

我需要进行哪些修改才能获得所需的输出?

编辑 - 由文件内容和所需输出更改。

【问题讨论】:

  • 列表中可以有更多项目,还是只有一个?是否所有项目行都以两个空格开头,所有虚拟行都以“虚拟”开头?如果最后两个问题的答案是“是”,那么通过迭代文件而不是使用 re.
  • 我可以在列表中包含更多项目。但是虚拟线没有虚拟线。这是一个大约 10 万行的大文件。

标签: python regex list


【解决方案1】:

我假设您要匹配的单词总是缩进的。

import re
regex = r"^\s+(\S.*)"

test_str = ("dummy line 1\n"
    "dummy line 2\n"
    "create_list animal -list     \n"
    "  tiger\n"
    "create_list bird -list        \n"
    "  crow\n"
    "dummy line 3\n"
    "create_list car -list        \n"
    "  ford/mustang\n"
    "dummy line 4\n"
    "dummy line 5")

match = re.findall(regex, test_str, re.MULTILINE)
print(match)

输出

['tiger', 'crow', 'ford/mustang']

【讨论】:

  • r"^\s+(.+)" 最好重写为r"^\s+(\S.*)",因为\s. 可以匹配相同的符号。
  • 感谢您的评论。根据ist改变了我的答案
【解决方案2】:

如果您的内容总是以空格开头,那么试试这个

import re

def extractListItems(File):
    f = open(File,"r")
    content = f.read().splitlines()
    pattern=lambda data:len(re.findall(r"^\s+",data))
    lst=[c.strip() for c in content if pattern(c)>0]
    print(lst)
    f.close()

extractListItems("samplefile.txt")

输出

['tiger', 'crow', 'ford/mustang']

 pattern=lambda data:re.findall(r"^[\s].*",data)
 lst=[val[0].strip() for val in map(pattern,content) if val]

结果

 ['tiger', 'crow', 'ford/mustang']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-13
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多