Skip to main content
 首页 » 编程设计

python之使用正则表达式从文本中提取特定字母并与字典进行比较

2024年12月31日38jackei

我有一个文本列表,其中 90% 的格式为 AABBB-CCCDDD001。并且此列表中也有一些文本可能由

AABBBICS-CCCDDD001 or  
AABBBIGW-CCCDDD001 or  
AABBBRTL-CCCDDD001 or  
AABBBTDZ-CCCDDD001 

这些是设备名称

AA - country code 
BBB - site code 
CCC - Function code 
DDD - Sub Function code. 

例如:USNYCRTL-LANDCE001

如果代码 ICS、IGW、RTL 或 TDZ 与文本中的代码匹配,我希望它输出它们各自的数字,为此我创建了一个字典:

ENVIRONMENTCODE = { 
    'ICS': '1', 
    'IGW': '2', 
    'RTL': '3', 
    'TDZ': '4' 
} 
 
NULLCODE = { 
    'NULL': '9' 
} 

所以,如果文本是:

AABBBICS-CCCDDD001 it should print '1' or  
AABBBIGW-CCCDDD001 it should print '2' or  
AABBBRTL-CCCDDD001 it should print '3' or  
AABBBTDZ-CCCDDD001 it should print '4' 

以上示例:USNYCRTL-LANDCE001 应该打印“3”,因为 RTL 对应于字典中的数字“3”

现在,对于格式为 AABBB-CCCDDD001 的 90% 的文本,应该打印“9”,因为它应该与键“NULL”配对。此外,可能很少有文本可以包含 AABBBXYZ-CCCDDD001,但我们需要忽略 XYZ,因为它不在字典中,只考虑字典中的那些。并将该文本也标记为“9”。

我知道这里可以使用正则表达式,但我正处于学习 python 的早期阶段,正则表达式现在对我来说似乎遥不可及。到目前为止,这是我尝试过的:

def environmentcode(self): 
    idx = self.name.find('-') 
    if idx > -1: 
        if self.name in ENVIRONMENTCODE: 
            return ENVIRONMENTCODE 
        else: 
            return NULLCODE 
    else: 
        return "Not Found" 

它只打印 NULLCODE 字典,不管文本中是否有键。谁能帮我解决这个问题。

请您参考如下方法:

我们可以使用.find来获取码字,如果它存在,然后使用字典将码字映射到它的码号。我们可以使用字典.get方法来返回缺失或未知码字的空码。如果遇到错误数据,此版本将返回 None:名称不包含 '-',或者名称前没有 8 或 5 个字母'-'.

env_code = { 
    'ICS': '1', 
    'IGW': '2', 
    'RTL': '3', 
    'TDZ': '4', 
} 
 
null_code = '9' 
 
def get_env_code(name): 
    idx = name.find('-') 
    if idx == 8: 
        # code may be valid 
        code = name[idx-3:idx] 
    elif idx == 5: 
        # code is missing 
        code = '' 
    else: 
        # Bad name 
        return None 
 
    return env_code.get(code, null_code) 
 
# test 
 
data = [ 
    'AABBBICS-CCCDDD001', 
    'AABBBIGW-CCCDDD001', 
    'AABBBRTL-CCCDDD001', 
    'AABBBTDZ-CCCDDD001', 
    'USNYCRTL-LANDCE001', 
    'AABBBXYZ-CCCDDD001', 
    'AABBB-CCCDDD001', 
    'BADDATA', 
] 
 
for s in data: 
    print(s, get_env_code(s)) 

输出

AABBBICS-CCCDDD001 1 
AABBBIGW-CCCDDD001 2 
AABBBRTL-CCCDDD001 3 
AABBBTDZ-CCCDDD001 4 
USNYCRTL-LANDCE001 3 
AABBBXYZ-CCCDDD001 9 
AABBB-CCCDDD001 9 
BADDATA None 

这是一个更简单的版本,它为错误数据返回空代码而不是 None。

def get_env_code(name): 
    idx = name.find('-') 
    code = name[idx-3:idx] if idx == 8 else '' 
    return env_code.get(code, null_code)