用正则表达式解析大文本文件

时间:2017-03-03 21:25:29

标签: python regex

我有一个包含100k +行的文本文件,这里是一个代码段:

:name ()
            :services_adtr (
                : (ReferenceObject
                    :Name (Any)
                    :Table (globals)
                    :Uid (97AEB369-9AEA-11D5-BD16-0090272CCNVF)
:src (
                :AdminInfo (
                    :chkpf_uid (ED8E5AB3-C793-42B0-AB9F-FFEFABDE4BxxA)
                    :ClassName (translate_hide)
                )
                : (ReferenceObject
                    :Name (h-10.140.20.20)
                    :Table (network_objects)
                    :Uid (37C4D635-C2F8-1644-9B2C-A09CD477777)
                )
                :adtr_method (adtr_method_hide)

对于每个以“:src”开头的部分,我需要在“:Name”之后提取括号中的所有内容,所以在这种情况下,我怎么能写一个正则表达式给我“h-10.140.20.20?这里是我到目前为止尝试过的正则表达式,都返回一个空列表。请注意,本文档中还有其他部分以“src_”“src-”开头 - 我需要帮助那些以“src”开头的部分..Thanks

import re

with open("INT-NAT.txt", "r") as f:
    text = f.read()
source = re.findall(r'src\s+.*:Name\s+[\(](.*)', text) and
source = re.findall(r'src\s+.*\s+[\:].*\s+[\(].*[\)]\s+[\:].*\s+[\(].*[\)]\s+[\)\\s+[\:]\s+[\(].*\s+[\:]Name\s+[\(](.*)', text)

print(source)

2 个答案:

答案 0 :(得分:0)

我只是逐行扫描文件,剥离每一行,然后检查它是否以:Name开头,并切断了parens中的内容。

以上几乎可以翻译成Python;试着这样做。

答案 1 :(得分:0)

只要所有行与您提供的行类似,此解决方案就会起作用:

import re

p = re.compile(r':src_adtr_translate.*ReferenceObject\W+:Name \(([^\)]*)\)')
with open('file.txt', 'r') as f:
    for line in f.readlines():
        results = p.findall(line)
        print(results[-1])

此代码的输出包含您提供的行的文件:

h-10.140.20.20

只要您要查找的:Name值最后出现,这就足够了。