使用正则表达式转换列表

Pau*_*aul 7 python regex

我有一个列表,其中包含此表单中的元素,字符串可能会更改,但格式保持相似:

["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)

BPL*_*BPL 1

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)