从多行文件中获取特定文本

时间:2019-07-26 17:54:45

标签: python regex regex-lookarounds regex-negation regex-group

考虑到文本文件具有多个换行符和空格,我想使用python中的Regex包从文件中过滤某些文本。该文件可能有几个数据块,但是唯一需要的是带有特定关键字的数据块。在我的问题中,它应该属于包含“ Route-Details”关键字的组。

让我们说文件(sample.txt)如下所示。

.
.
.
 Host1<-->Host2 Con. ID:         0x0fc2f0d9  (abc123)
  Con. Information:
     [Gw]  Route-Details 
        R-Code:      0xaaaa (1a2) Route-Details
        Router-ID:     0x21       (a4)  [Gw] 
        Path-Code:    0x00e   (15)
        Data: 123-abcd.djsjdkks www.somesite. port 11

Coded info
                   aa aa aa aa aa aa aa aa   1111-aaa
                   aa aa aa aa aa aa aa aa   1111-aaa
.
.
.

这是我写的

import re
with open("sample.txt", "r") as fl:
    in_file= fl.read()

(re.search('(?<=Route-Details).* Data:', in_file,re.DOTALL).group())

我希望能得到这个。

123-abcd.djsjdkks www.somesite. port 11

但是,我明白了。

R-Code:      0xaaaa (1a2) Route-Details
        Router-ID:     0x21       (a4)  [Gw] 
        Path-Code:    0x00e   (15)
        Data:

我想知道是否可以为此获得简化和详细的解决方案。 非常感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

您可以使用积极的后向和捕捉群体:

re.findall(r'(?<=Data: )(.*?)\n', text)

收益:

['123-abcd.djsjdkks www.somesite. port 11']

此外,您可以尝试以下操作以包含您指定的Route-Details条件:

re.findall(r'(?<=Route-Details).*?(?<=Data: )(.*?)\n', text, re.DOTALL)

有关详细说明,请参见here。另外,re.DOTALL指定.字符将匹配所有字符,包括换行符

答案 1 :(得分:0)

我会做类似的事情

re.search('(?=Data: ).*\n', infile, re.DOTALL).group()

我认为您的问题是您的表达式试图匹配从“路由详细信息”到“数据:”的所有内容。

希望这会有所帮助:)

答案 2 :(得分:0)

这将解决此问题,我已经对其进行了测试。 它的输出与您预期的相同:

import re
with open("sample.txt", "r") as fl:
    in_file= fl.read()
    print(re.search('(?<=Data: ).* port 11', in_file, re.DOTALL).group())

答案 3 :(得分:0)

当您想在已知侧面的python中使用正则表达式检索文本的一部分时,最简单的方法是:

re.search('left_flanking_text(*.)right_flanking_text, text_to_search_into).group(1)

*。将匹配除换行符之外的任意数量的字符,因此,在您的情况下,如果不使用DOTALL标志,则可以在不指定换行符的情况下将换行符用作右侧。 不带参数(或0作为参数)的group()方法返回完全匹配项,而与捕获组无关。

group(1)返回第一个捕获组。在您的情况下,第一个捕获组是一个lookbehind语句,因此它将不返回任何内容。

恢复所需的表达式是:

re.search('Data:(.*)', in_file).group(1)

要将其限制在Route-Details块中,您可以编写:

re.search('Route-Details[\S\s]*?Data:(.*)', in_file).group(1)

[\ S \ s] *将匹配任何字符(包括新行)

?数据:将匹配先前匹配项后找到的第一个“数据:”