2017-10-12 7 views
3

私はUNIXマシンの\etc\servicesファイルからいくつかの情報をキャプチャしたいのですが、間違った値をキャプチャしています。正規表現で '/ etc/services'を取得する

[('dircproxy\t57000/tcp', 'dircproxy', '57000', 'tcp')] 
[('tfido\t\t60177/tcp', 'tfido', '60177', 'tcp')] 
[('fido\t\t60179/tcp', 'fido', '60179', 'tcp')] 

私はこのようにそれを望む:私はこれを考える

[('dircproxy', '57000', 'tcp')] 
[('tfido', '60177', 'tcp')] 
[('fido', '60179', 'tcp')] 

私は

with open('/etc/services') as ports_file: 
    lines = ports_file.readlines() 
    for line in lines: 
     print re.findall('((\w*\-*\w+)+\W+(\d+)\/(tcp|udp))', line) 

今持っている。しかし、それは、このような不正な値が得られている何

(\w*\-*\w+)+は私の正規表現で必要です。なぜならいくつかはdefこのようにしてくださいthis-should-capture

+1

外かっこを削除します。 –

+0

@WiktorStribiżew申し訳ありませんが、私は正規表現で吸う。ありがとうalot – Ludisposed

+1

ここで正規表現を使用する特別な理由はありますか? 'split()'の仕事のように思えます。 –

答えて

1

フィールドの値を照合する代わりに、フィールドの値を一致させる代わりに、フィールドの値を一致させることをお勧めします。

print re.split(r'[\s/]+', line.split('#', 1)[0])[:3] 

最初line.split('#', 1)[0]コメント(ファイルの最初の#後に何かを)削除します。

0

これは個人的に正規表現を使用しません。以下の解決策を見て、あなたのニーズに合っているかどうかを調べてみてください(ファイルオブジェクトを直接反復処理できることにも注意してください)。

services = [] 
with open('/etc/services') as serv: 
    for line in serv: 
     l = line.split() 
     if len(l) < 2: 
      continue 
     if '/tcp' in l[1] or '/udp' in l[1]: 
      port, protocol = l[1].split('/') 
      services.append((l[0], port, protocol)) 
関連する問題