考虑到文本文件具有多个换行符和空格,我想使用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:
我想知道是否可以为此获得简化和详细的解决方案。 非常感谢您的帮助。
答案 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] *将匹配任何字符(包括新行)
?数据:将匹配先前匹配项后找到的第一个“数据:”