我正在尝试使用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
答案 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
根据您实际想要对每个人做的事情,您可以调整结果。正则表达式使网络可选,这可能一直在绊倒你。希望这能让你朝着正确的方向前进!