在循环中匹配和组合类似的字符串

时间:2014-03-09 14:35:02

标签: python regex string match

我正在尝试匹配并对列表中的类似字符串进行分组,但我不确定如何处理此问题。

我有以下列表:

tablenames =[
            'SCS_q104',
            'SCS_q102[{SCS_q102$_$_$SCS_q102_1}].SCS_q102_grid',
            'SCS_q102[{SCS_q102$_$_$SCS_q102_2}].SCS_q102_grid',
            'SCS_q102[{SCS_q102$_$_$SCS_q102_3}].SCS_q102_grid',
            'SCS_q102[{SCS_q102$_$_$SCS_q102_4}].SCS_q102_grid',
            'SCS_q105',
            'SCS_q106',
            'SCS_q107[{SCS_q107$_$_$SCS_q107_1}].SCS_q107_grid',
            'SCS_q107[{SCS_q107$_$_$SCS_q107_2}].SCS_q107_grid',
            'SCS_q107[{SCS_q107$_$_$SCS_q107_3}].SCS_q107_grid',
            'SCS_q108',
            'SCS_q109',
            ]

预期结果:

groupofgrids = [[
        'SCS_q102[{SCS_q102$_$_$SCS_q102_1}].SCS_q102_grid',
        'SCS_q102[{SCS_q102$_$_$SCS_q102_2}].SCS_q102_grid',
        'SCS_q102[{SCS_q102$_$_$SCS_q102_3}].SCS_q102_grid',
        'SCS_q102[{SCS_q102$_$_$SCS_q102_4}].SCS_q102_grid',
        ][
        'SCS_q107[{SCS_q107$_$_$SCS_q107_1}].SCS_q107_grid',
        'SCS_q107[{SCS_q107$_$_$SCS_q107_2}].SCS_q107_grid',
        'SCS_q107[{SCS_q107$_$_$SCS_q107_3}].SCS_q107_grid',
        ]]

从上面的预期结果中,您可以看到我想如何对字符串进行分组。 如果括号前后的所有内容都与之前的字符串相同,则它们属于单个组。

此示例中有两组。

预期结果必须简单地对匹配的字符串组进行分组,如果将其存储为列表或某种字典,则无关紧要。

到目前为止我的尝试:

groupofgrids = []
for item in tablenames:
    if "." in item:
        suffix = item.split(".")[-1]
        if suffix in item:
            groupofgrids.append(item)

print groupofgrids

这个方法实际上并没有像我想要的那样对类似字符串进行分组,因为我不确定如何。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

由于相似性是基于括号[...]之间的内容之外的字符串,提取这些子字符串,使用分隔符(这里我使用"-")加入它们并使用它作为词典的关键词 试试这个 -

import re
regex = re.compile(r'(.*?)\[.*?\]\.(.*)')
groupofgrids = {}
for item in tablenames:
    matches = regex.findall(item)
    if (len(matches) > 0 and len(matches[0]) == 2):    
        key = "-".join(matches[0])
        if key in groupofgrids:
            groupofgrids[key].append(item)
        else:
            groupofgrids[key] = [item]
import json
print json.dumps(groupofgrids,sort_keys=True, indent=4)
#OUTPUT
'''
{
    "SCS_q102-SCS_q102_grid": [
        "SCS_q102[{SCS_q102$_$_$SCS_q102_1}].SCS_q102_grid", 
        "SCS_q102[{SCS_q102$_$_$SCS_q102_2}].SCS_q102_grid", 
        "SCS_q102[{SCS_q102$_$_$SCS_q102_3}].SCS_q102_grid", 
        "SCS_q102[{SCS_q102$_$_$SCS_q102_4}].SCS_q102_grid"
    ], 
    "SCS_q107-SCS_q107_grid": [
        "SCS_q107[{SCS_q107$_$_$SCS_q107_1}].SCS_q107_grid", 
        "SCS_q107[{SCS_q107$_$_$SCS_q107_2}].SCS_q107_grid", 
        "SCS_q107[{SCS_q107$_$_$SCS_q107_3}].SCS_q107_grid"
    ]
}
'''

如果您想要嵌套列表,请执行此操作 -

li = groupofgrids.values()
print json.dumps(li,sort_keys=True, indent=4)
#OUPTUT
'''
[
    [
        "SCS_q107[{SCS_q107$_$_$SCS_q107_1}].SCS_q107_grid", 
        "SCS_q107[{SCS_q107$_$_$SCS_q107_2}].SCS_q107_grid", 
        "SCS_q107[{SCS_q107$_$_$SCS_q107_3}].SCS_q107_grid"
    ], 
    [
        "SCS_q102[{SCS_q102$_$_$SCS_q102_1}].SCS_q102_grid", 
        "SCS_q102[{SCS_q102$_$_$SCS_q102_2}].SCS_q102_grid", 
        "SCS_q102[{SCS_q102$_$_$SCS_q102_3}].SCS_q102_grid", 
        "SCS_q102[{SCS_q102$_$_$SCS_q102_4}].SCS_q102_grid"
    ]
]
'''

答案 1 :(得分:0)

这适合你:

group = dict()

for elm in tablenames:
    try:
        f,s = elm.split('.')
    except:
        pass
    else:
        group.setdefault(s,[])
        group[s].append(elm)

import pprint
pprint.pprint(group.values())

输出:

[['SCS_q107[{SCS_q107$_$_$SCS_q107_1}].SCS_q107_grid',
  'SCS_q107[{SCS_q107$_$_$SCS_q107_2}].SCS_q107_grid',
  'SCS_q107[{SCS_q107$_$_$SCS_q107_3}].SCS_q107_grid'],
 ['SCS_q102[{SCS_q102$_$_$SCS_q102_1}].SCS_q102_grid',
  'SCS_q102[{SCS_q102$_$_$SCS_q102_2}].SCS_q102_grid',
  'SCS_q102[{SCS_q102$_$_$SCS_q102_3}].SCS_q102_grid',
  'SCS_q102[{SCS_q102$_$_$SCS_q102_4}].SCS_q102_grid']]