[英]Remove line containing specific string
我有一個腳本,我想用它從文件中刪除包含特定IP地址的行。 這是:
for line in fileinput.input(hostsFileLoc,inplace =1):
line = line.strip()
if not hostIP in line:
print line
然而,這種作品有兩件事我想解決。
此腳本將刪除所有匹配項,因此在之前的示例中
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”,這不是我想要的。
此腳本也不處理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文件,為什么不簡單地解析文件並刪除你想要的任何條目?
那么我們不想要哪條線? 那些包含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.