簡體   English   中英

Python 2.7查找IP地址並替換為文本

[英]Python 2.7 find IP address and replace with text

我已經使用Python從路由器中提取路由表,並試圖

  1. 刪除多余的文本,並
  2. 用文本字符串替換每個路線的目的地,以匹配不同的客戶分組。

目前,我有:

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.

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