【问题标题】:Retrieving text from Pattern1 to Pattern2 - Python从 Pattern1 到 Pattern2 检索文本 - Python
【发布时间】:2014-06-26 16:22:21
【问题描述】:

我有一个输入文件如下

PATTERN1 PTR1 blah blah blah
needThis  blah blah blah
thisOneAsWell  blah blah blah
PATTERN2

PATTERN1 PTR2 blah blah blah
needThis  blah blah blah
thisOneAsWell  blah blah blah
PATTERN2 

............................
............................

PATTERN1  PTRN blah blah
needThis  blah blah blah
thisOneAsWell blah blah blah
PATTERN2

我需要我的函数只返回从 PATTERN1 到 PATTERN2 的第一列条目,如下所示,

PTR1
needThis thisOneAsWell

PTR2
needThis thisOneAsWell

......................
......................
PTRN
needThis thisOneAsWell

PTR1 , PTR2 ...... PTRN 是各自不同的文本。 PATTERN1 和 PATTERN2 不同,但始终存在于文件中。

如何在 Python 中实现这一点?

我仍然是 Python 的初学者,我正在尝试实现这个使用 re.findall() 没有得到想要的 o/p:

def retrieve():
    file = open("fileName","r")
    string = re.findall(r"PATTERN1",file.read())
    print string

【问题讨论】:

    标签: python regex python-2.7


    【解决方案1】:

    你可以嵌套两个正则表达式:

    txt='''\
    PATTERN1 PTR1 blah blah blah
    needThis1  blah blah blah
    thisOneAsWell1  blah blah blah
    PATTERN2
    
    PATTERN1 PTR2 blah blah blah
    needThis2  blah blah blah
    thisOneAsWell2  blah blah blah
    PATTERN2 
    
    ............................
    ............................
    
    PATTERN1  PTRN blah blah
    needThisN  blah blah blah
    thisOneAsWellN blah blah blah
    PATTERN2'''
    
    import re
    
    for m in re.finditer(r'^PATTERN1\s*(.*?)(?=^PATTERN2)', txt, re.M | re.S):
        print re.findall(r'(^\w+)', m.group(1), re.M)
    

    打印:

    ['PTR1', 'needThis1', 'thisOneAsWell1']
    ['PTR2', 'needThis2', 'thisOneAsWell2']
    ['PTRN', 'needThisN', 'thisOneAsWellN']
    

    编辑 1

    如果您使用的文件可以轻松放入内存:

    with open(fn) as f:
        txt=f.read()
        for m in re.finditer(r'^PATTERN1\s*(.*?)(?=^PATTERN2)', txt, re.M | re.S):
            print re.findall(r'(^\w+)', m.group(1), re.M)
    

    mmap 用于无法轻松放入内存的较大文件。


    编辑 2

    将结果连接成一个字符串后,只需将结果附加到列表中即可:

    with open(fn) as f:
        results=[]
        txt=f.read()
        for m in re.finditer(r'^PATTERN1\s*(.*?)(?=^PATTERN2)', txt, re.M | re.S):
            results.append('\n'.join(re.findall(r'(^\w+)', m.group(1), re.M))
        print '\n===\n'.join(results)
    

    【讨论】:

    • 谢谢,但是我的输入文本可能会有所不同,因此我将不得不使用 file = open()
    • 你可以在打开文件的情况下做同样的事情。只需将文件内容读入字符串即可。我只是以txt 字符串为例。
    • 谢谢,它成功了!最后一个问题,我想返回最终输出。将匹配的表达式作为列表或字符串返回的最佳方法是什么?请评论
    • 返回最终输出是什么意思?
    • 我需要将其返回给调用者,而不是 print re.findall()。
    【解决方案2】:
    import re
    with open('file', 'r') as f:
        content = f.read()
        matches = re.findall(r'PATTERN1(.*?)PATTERN2', content, re.MULTILINE|re.DOTALL)
    
    for match in matches:
        for line in match.split('\n'):
            columns = line.split()
            if columns:
                print(columns[0])
    

    【讨论】:

    • 谢谢,但您的函数返回 pattern1 pattern2 之间的所有文本。
    猜你喜欢
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2012-06-13
    相关资源
    最近更新 更多