与regex匹配的多列表迭代?

2024-10-01 15:44:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试自动化一个我在工作中经常做的数据处理活动时遇到了一个问题,而目前我一直在处理数据集中的名称,从第三方命名系统到我们自己的命名系统

我有两份名单,第三方名单:

thirdPartyList = ('NWM-A fun game [1 - 1234567890 - 9876]', 
                  'NWM(M)- A funner game! [2 - 1234567899 - 9877]', 
                  'NWM-Best funner-er game [3 - 0987654321 - 9878]',   
                   ...)

以及我自己的列表,包括手动输入的每个游戏的名称:

ourGameList = ('A fun game', 'A funner game!', 'Best funner-er game', ...) 

第三方命名系统是:

3 letter word for game manafacturer-Name of a Game! [Floor position number - serial number - third party specific tracking number]

但也可以更改为,例如:

Game man(A letter in brackets indicating cabinet)-Name of a Game!

我尝试过使用简单的字符串替换,然后比较每个索引元素,但问题是,我想替换的数字和一些字符也出现在实际的游戏名称中

这是一个可正则化的问题吗?在过去的一个小时里,我一直在寻找带有列表的regex示例,但我不知道是否可以使用regex在一个列表中迭代,使用另一个列表的内容,例如:

for i,j in ourList, thirdPartyList:
    if ourList[i].*some regex stuff* == thirdPartyList[i]:
        thirdPartyList[i] = ourList[i]

我还要注意的是,在第一个方括号前只能有17个字符,所以游戏名会经常在中间被切掉

如果有什么我不能解释的,请告诉我,谢谢你的通读


Tags: 名称game游戏number列表系统命名regex
1条回答
网友
1楼 · 发布于 2024-10-01 15:44:13

您完全可以使用regex来执行以下操作:

import re

thirdPartyList = ('NWM-A fun game [1 - 1234567890 - 9876]', 
                  'NWM(M)- A funner game! [2 - 1234567899 - 9877]', 
                  'NWM-Best funner-er game [3 - 0987654321 - 9878]',   
                   )

def name_game(name_str):
    match_str = r'(?P<mfg>[A-Z]{3})(\((?P<cabinet>[A-Z])\))?-(?P<name>.*?)\[(?P<floor>[0-9]+) - (?P<serial>[0-9]+) - (?P<track>[0-9]+)\]'
    match = re.match(match_str, name_str)
    return match.groupdict()

for name_str in thirdPartyList:
    print(name_game(name_str))

输出如下:

{'mfg': 'NWM', 'cabinet': None, 'name': 'A fun game ', 'floor': '1', 'serial': '1234567890', 'track': '9876'}
{'mfg': 'NWM', 'cabinet': 'M', 'name': ' A funner game! ', 'floor': '2', 'serial': '1234567899', 'track': '9877'}
{'mfg': 'NWM', 'cabinet': None, 'name': 'Best funner-er game ', 'floor': '3', 'serial': '0987654321', 'track': '9878'}

对于要匹配的字符串的每一部分,模式都有一个(?P<tag>...),其中有自己的模式。“cabinet”并不总是在那里,因此它后面有一个?,表示0或1个匹配项。这一个实际上有点复杂,因为它包含在()中,而()并不总是在那里,所以整个东西都在一个未命名的组中:(\((?P<cabinet>[A-Z])\))?。名称上的前导和尾随空格可以稍后去掉,或者可以在name组之前和之后放置一个\s*

更多信息here

相关问题 更多 >

    热门问题