我有一个列表,其中包含此表单中的元素,字符串可能会更改,但格式保持相似:
["Radio0","Tether0","Serial0/0","Eth0/0","Eth0/1","Eth1/0","Eth1/1","vlanX","modem0","modem1","modem2","modem3","modem6"]
Run Code Online (Sandbox Code Playgroud)
我想将其转换为下面的列表.你可以看到它会删除同一个字符串出现的副本,例如Eth - 只在新列表中出现一个并将数字转换为x和y以更通用:
["RadioX","TetherX","SerialX/Y","EthX/Y","vlanX","modemX"]
Run Code Online (Sandbox Code Playgroud)
我正在搞乱不同的正则表达式,我的方法很乱,会对你们想到的任何优雅的解决方案感兴趣.
这里有一些可以改进的代码,也设置不保留顺序,所以也应该改进:
a = ["Radio0","Tether0","Serial0/0","Eth0/0","Eth0/1","Eth0/2","Eth1/0","vlanX","modem0","modem1","modem2","modem3","modem6"]
c =[]
for i in a:
b = re.split("[0-9]", i)
if "/" in i:
c.append(b[0]+"X/Y")
elif len(b) > 1:
c.append(b[0]+"X")
else:
c.append(b)
print set(c)
set(['modemX', 'TetherX', 'RadioX', 'vlanX', 'SerialX/Y', 'EthX/Y'])
Run Code Online (Sandbox Code Playgroud)
保留订单的设置可能有所改进:
unique=[]
[unique.append(item) for item in c if item not in unique]
print unique
['RadioX', 'TetherX', 'SerialX/Y', 'EthX/Y', 'vlanX', 'modemX']
Run Code Online (Sandbox Code Playgroud)
import re
def particular_case(string):
return re.sub("\d+", "X", re.sub("\d+/\d+", "X/Y", w))
def generic_case(string, letters=['X', 'Y', 'Z']):
len_letters = len(letters)
list_matches = list(re.finditer(r'\d+', string))
result, last_index = "", 0
if len(list_matches) == 0:
return string
for index, match in enumerate(list_matches):
result += string[last_index:
match.start(0)] + letters[index % len_letters]
last_index = match.end(0)
return result
if __name__ == "__main__":
words = ["Radio0", "Tether0", "Serial0/0", "Eth0/0", "Eth0/1", "Eth1/0",
"Eth1/1", "vlanX", "modem0", "modem1", "modem2", "modem3", "modem6"]
result = []
result2 = []
for w in words:
new_value = particular_case(w)
if new_value not in result:
result.append(new_value)
new_value = generic_case(w)
if new_value not in result2:
result2.append(new_value)
print result
print result2
Run Code Online (Sandbox Code Playgroud)