在python的re模块中需要帮助

时间:2017-07-13 13:43:57

标签: regex python-3.x regex-group

我正在尝试使用re模块解析文件。我尝试了三个版本的代码,前两个版本没有检索任何O / P.第三个版本只检索一行。有人可以看看吗? 版本1:

import re
file = open('sample.txt', 'r') 
x = file.readline()
while x:
    var = re.findall(r'(?:\*|\*>)\s+(\d+.\d+.\d+.\d+\/\d+\s+)?(\S+)\s+\d+\s+(\d+\s+.+)[ie]',x)
    x = file.readline()
print(var)
file.close()

版本2:

import re
file = open('sample.txt', 'r')
x = file.read()
var = re.findall(r'(?:\*|\*>)\s+(\d+.\d+.\d+.\d+\/\d+\s+)?(\S+)\s+\d+\s+(\d+\s+.+)[ie]',x)
print(var)
file.close()

版本3:

import re
file = open('sample.txt', 'r') 
x = file.readline()
while x:
    var = re.search(r'(?:\*|\*>)\s+(\d+.\d+.\d+.\d+\/\d+\s+)?(\S+)\s+\d+\s+(\d+\s+.+)[ie]',x, re.M)
    x = file.readline()
print(var.group(0))
file.close()

sample.txt中的数据如下。第一行后网络是空白的,当我在python shell上单独运行这些语句时,正则表达式正在运行。

                Oregon Exchange BGP Route Viewer
      route-views.oregon-ix.net / route-views.routeviews.org

此硬件是NSF资助的一部分。  如果您有任何疑问,请联系help@routeviews.org  如果你想提出自己的观点。

 Network          Next Hop            Metric LocPrf Weight Path
 *   64.48.0.0/16     173.205.57.234                         0 53364 3257 2828 i

 *                    202.232.0.2                            0 2497 2828 i

 *                    93.104.209.174                         0 58901 51167 1299 2828 i

 *                    193.0.0.56                             0 3333 2828 i

 *                    103.197.104.1                          0 134708 3491 2828 i

 *                    132.198.255.253                        0 1351 6939 2828 i

1 个答案:

答案 0 :(得分:0)

我认为这会解决问题:

import re

thelist = [
"*   64.48.0.0/16     173.205.57.234                         0 53364 3257 2828 i",
"*                    93.104.209.174                         0 58901 51167 1299 2828 i",
"*                    193.0.0.56                             0 3333 2828 i",
]

regex = re.compile("\*\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,3})?\s+([\S]+)\s+([^i]+i)")

for text in thelist:
    match = re.search(regex, text)
    if match:
        print ("yuppers")
        print (match.group(1))
        print (match.group(2))
        print (match.group(3))
        print ("\n")
    else:
        print ("nope")

结果

yuppers
64.48.0.0/16
173.205.57.234
0 53364 3257 2828 i


yuppers
None
93.104.209.174
0 58901 51167 1299 2828 i


yuppers
None
193.0.0.56
0 3333 2828 i

根据您实际想要对每个人做的事情,您可以调整结果。正则表达式使网络可选,这可能一直在绊倒你。希望这能让你朝着正确的方向前进!