匹配的多列表迭代 - 正则表达式?

时间:2018-02-26 02:43:37

标签: python python-3.x

我在尝试自动执行我经常在工作中执行的数据处理活动时遇到问题,而我当前遇到的部分是将数据集中的名称从第三方命名系统处理到我们自己的命名系统。< / p>

我有两个列表,第三方列表:

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!

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

这是一个可以复制的问题吗?我一直在寻找过去一小时左右的带有列表的正则表达式示例,但我不知道你是否可以使用正则表达式迭代一个列表,使用另一个列表的内容,如:

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

我还注意到在第一个方括号之前只能有17个字符,所以游戏名称会在中途经常被切断。

让我知道是否有任何我无法正确解释的内容并感谢您的阅读。

1 个答案:

答案 0 :(得分:0)

你绝对可以使用正则表达式:

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>...),其中包含自己的模式。 “内阁”并不总是存在,所以它后面有?,表示0或1个匹配。那个实际上有点复杂,因为它包含在()中并不总是存在,所以整个事物都在一个未命名的组中:(\((?P<cabinet>[A-Z])\))?。名称上的前导和尾随空格可以稍后删除,或者您可以在\s*组之前和之后放置name

更多信息here