![](/img/trans.png)
[英]Remove ip address in a text file and replace it with the random ip address in python
[英]Python 2.7 find IP address and replace with text
我已經使用Python從路由器中提取路由表,並試圖
目前,我有:
infile = "routes.txt"
outfile = "output.txt"
delete_text = ["ROUTER1# sh run | i route", "ip route"]
client_list = ["CUST_A","CUST_B"]
subnet_list = ["1.2.3.4","5.6.7.8"]
fin = open(infile)
fout = open(outfile, "w+")
for line in fin:
for word in delete_text:
line = line.replace(word, "")
for word in subnet_list:
line = line.replace("1.2.3.4", "CUST_A")
for word in subnet_list:
line = line.replace("5.6.7.8", "CUST_B")
fout.write(line)
fin.close()
fout.close()
f = open('output.txt', 'r')
file_contents = f.read()
print (file_contents)
f.close()
這在一定程度上5.6.7.8
,但是當它搜索並替換為5.6.7.8
它也會在其他IP地址(如5.6.7.88
獲取該字符串,並且也替換了我不想發生的字符串。
我所追求的是一個完全匹配的東西,只有找到並替換掉。
您可以將re.sub()
與明確的字詞邊界( \\b
)結合使用:
>>> re.sub(r'\b5.6.7.8\b', 'CUST_B', 'test 5.6.7.8 test 5.6.7.88 test')
'test CUST_B test 5.6.7.88 test'
如您所知,您的方法是不好的,因為它會導致誤報(例如,不良匹配)。 您應該將這些行解析為標記,然后匹配各個標記。 這可能就像首先要做tokens = line.split()
在空格上分割一樣簡單。 但是,如果該行包含帶引號的字符串,則可能不起作用。 請考慮以下語句的結果: "ab 'cd ef' gh".split()
。 因此,您可能需要一個更復雜的解析器。
您可以使用re
模塊使用\\b
元序列來執行替換,以確保匹配在“單詞”邊界上開始和結束。 但這有其自己獨特的故障模式。 例如,考慮.
(句點)字符與任何字符匹配。 因此按照@NPE的建議進行re.sub('\\b5.6.7.8\\b', ...)
實際上不僅會匹配字面值5.6.7.8
而且還會5x6.7y8
。 考慮到您期望的輸入,這可能不是問題,但大多數人不考慮這一點,因此是錯誤的另一個來源。 正則表達式很少是解決此類問題的正確工具。
謝謝大家,我已經對此進行了測試,並且re.sub函數似乎在循環中打印了以下字符串:
我已經將上面的代碼片段修改為:for subnet_list中的單詞:line = re.sub(r'\\ b5.6.7.8 \\ b','CUST_B','5.6.7.88')
理想情況下,我希望在所有出現的列表中替換字符串元素以及保留列表結構?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.