簡體   English   中英

刪除包含特定字符串的行

[英]Remove line containing specific string

我有一個腳本,我想用它從文件中刪除包含特定IP地址的行。 這是:

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

然而,這種作品有兩件事我想解決。

  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地址(根據上面的列表)中刪除,還需要一個csv文件,其中第一個字段是違規的IP地址。 我嘗試在strip函數中使用正則表達式[\\s\\,]+ ,但這不能正常工作,並在將剩余的行重新打印回文件時添加一個空行。

我知道這可能有很多要問,但我仍然試圖找到解決Python奇跡的方法。

您只需要在測試中更具體。 對於第一個示例測試,整行(在一個條帶之后)等於ip地址(比它包含它更嚴格 - 從而解決你的第一個問題)。 對於第二行,將逗號字符上的每一行拆分,並測試第一個元素是否等於您的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)

如果你去掉字符串,你可以測試它們是否相等,而不是它是否包含輸入。

for line in fileinput.input(hostsFileLoc,inplace =1):
    line = line.strip()
    # Only print if they are not the same
    if hostIP != line:
        print line
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

我會使用正則表達式從行中提取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

那么我們不想要哪條線? 那些包含ip-address的行!

這個的正則表達式是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM