2

ファイルから特定のIPアドレスを含む行を削除するために使用したいスクリプトがあります。これは:

for line in fileinput.input(hostsFileLoc,inplace =1):
    line = line.strip()
    if not hostIP in line:
        print line

この種の作品ですが、私が解決しようとしていることが2つあります。

  1. このスクリプトは一致するものをすべて削除するので、前の例では

    127.0.0.1
    127.0.0.11
    127.0.0.111
    192.168.0.1

    「127.0.0.11」の入力でこれを実行すると、「127.0.0.11」と「127.0.0.111」の両方が削除されますが、これは私が望むものではありません。

  2. このスクリプトはcsvファイルも処理しません。上記のリストのように、各行がちょうどで行ごとのIPアドレスであるファイルと、最初のフィールドが問題のあるIPアドレスであるcsvファイルからそれを削除する必要があります。ストリップ関数で正規表現を使用しようとしました[\s\,]+が、これは正しく機能せず、残りの行をファイルに再印刷するときに空白行が追加されます。

これは質問することがたくさんあるかもしれませんが、私はまだPythonの素晴らしさを回避する方法を見つけようとしています。

4

5 に答える 5

3

テストでより具体的にする必要があるだけです。最初の例では、行全体 (ストリップの後の) が IP アドレスと等しいことをテストします (それが含まれているよりも厳密であるため、最初の問題を回避できます)。2 番目については、コンマ文字で各行を分割し、最初の要素が IP アドレス文字列と等しいことをテストします。

したがって、最初のファイル タイプの場合:

for line in fileinput.input(hostsFileLoc,inplace =1):
    line = line.strip()
    if line != hostIP:
        sys.stdout.write(line)

csv ファイルタイプの場合:

for line in fileinput.input(hostsFileLoc,inplace =1):
    elements = line.split(",")
    first = elements[0].strip()
    if first != hostIP:
        sys.stdout.write(line)
于 2012-07-01T20:40:19.150 に答える
3

文字列を削除すると、入力が含まれているかどうかではなく、等しいかどうかをテストできます。

for line in fileinput.input(hostsFileLoc,inplace =1):
    line = line.strip()
    # Only print if they are not the same
    if hostIP != line:
        print line
于 2012-07-01T20:42:17.993 に答える
2
for line in fileinput.input(hostsFileLoc,inplace =1):
    line = line.strip()
    if hostIP!=line:
        print line

csv ファイルの場合:

for line in fileinput.input(hostsFileLoc,inplace =1):
    line = line.strip()
    if not line.startswith(hostIP+','):
        print line
于 2012-07-02T11:27:25.750 に答える
1

では、どの行が望ましくないのでしょうか? IPアドレスを含む行!

これの正規表現はr'127\.0\.0\.1'. 正規表現ではドットが特別な意味を持つため、ドット ( ) をエスケープし\.て文字どおりのドットにする必要があります。

ただし、アドレスが先頭 ( ^) または非数字 ( \D) の後にあり、その後に行末 ( $) または非数字が続く行のみを意味します。

それは:r'(^|\D)127\.0\.0\.1(\D|$)'

import re
regexp = re.compile( r'(^|\D)' + re.escape( '127.0.0.1' ) + r'(\D|$)' )

for line in fileinput.input(hostsFileLoc,inplace =1):
    line = line.strip()
    if not regexp.search( line ):
        print line
于 2012-07-01T20:57:57.320 に答える
1

正規表現を使用して行から IP アドレスを抽出し、探している IP と照合します。

ValidIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5] ]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0 -5])$"

http://docs.python.org/library/re.html

これは、このような単純なタスクには多すぎるかもしれませんが、それ以外の場合は、すべてのエッジ ケースを個別に処理する必要があり、ダーティで複雑なコードが生成される可能性があります。特に、将来他のフィルターを追加する必要がある場合 (たとえば、ホットネームなど)。

CSV ファイルについては、単純にファイルを解析して、必要なエントリを削除してみませんか?

http://docs.python.org/library/csv.html

于 2012-07-01T20:52:57.623 に答える