我正在尝试解析whois查询的结果。我有兴趣检索route,descr和origin字段,如下所示:
route: 129.45.67.8/91
descr: FOO-BAR
descr: Information 2
origin: AS5462
notify: foo@bar.net
mnt-by: AS5462-MNT
remarks: For abuse notifications please file an online case @ http://www.foo.com/bar
changed: foo@bar.net 20000101
source: RIPE
remarks: ****************************
remarks: * THIS OBJECT IS MODIFIED
remarks: * Please note that all data that is generally regarded as personal
remarks: * data has been removed from this object.
remarks: * To view the original object, please query the RIPE Database at:
remarks: * http://www.foo.net/bar
remarks: ****************************
route: 123.45.67.8/91
descr: FOO-BAR
origin: AS3269
mnt-by: BAR-BAZ
changed: foo@bar.net 20000101
source: RIPE
remarks: ****************************
remarks: * THIS OBJECT IS MODIFIED
remarks: * Please note that all data that is generally regarded as personal
remarks: * data has been removed from this object.
remarks: * To view the original object, please query the RIPE Database at:
remarks: * http://www.ripe.net/whois
remarks: ****************************
为此,我使用以下代码和正则表达式:
search = "FOO-BAR"
with open(FILE, "r") as f:
content = f.read()
r = re.compile(r'route:\s+(.*)\ndescr:\s+(.*' + search + '.*).*\norigin:\s+(.*)', re.IGNORECASE)
res = r.findall(content)
print res
它按预期工作,结果只包含一个descr字段,但忽略包含多个descr字段的结果。
在这种情况下,我得到以下结果:
[('123.45.67.8/91', 'FOO-BAR', 'AS3269')]
预期的结果是在多个描述行和原点字段的情况下有路径字段,第一个descr字段。
[('129.45.67.8/91', 'FOO-BAR', 'AS5462'), ('123.45.67.8/91', 'FOO-BAR', 'AS3269')]
解析包含一个AND几个descr行的结果的正确正则表达式是什么?
答案 0 :(得分:1)
我与你的要求非常接近:
import re
search = "FOO-BAR"
with open('whois', "r") as f:
content = f.read()
r = re.compile( r'' #
'route:\s+(.*)\n' #
'(descr:\s+(?!FOO-BAR).*\n)*' # Capture 0-n lines with descr: field but without FOO-BAR
'descr:\s+(FOO-BAR)\n' # Capture at least one line with descr: and FOO-BAR
'(descr:\s+(?!FOO-BAR).*\n)*' # Capture 0-n lines with descr: field but without FOO-BAR
'origin:\s+(.*)', #
re.IGNORECASE)
#r = re.compile('(route:\n)((descr:)(?!FOO-BAR)(.*)\n)*((descr:)(FOO-BAR)\n)?((descr:)(?!FOO-BAR)(.*)\n)*')
res = r.findall(content)
print res
结果:
>>> [('129.45.67.8/91', '', 'FOO-BAR', 'descr: Information 2\n', 'AS5462'),
('123.45.67.8/91', '', 'FOO-BAR', '', 'AS3269')]
通过一些清洁,您可以获得结果