在python中从字符串或列表中提取列

在python中从字符串或列表中提取列,python,python-2.7,Python,Python 2.7,我试图从python中的值字符串中提取列。值字符串如下所示- CN=Unix ADISID,OU=SA,OU=DGO,DC=dom,DC=ab,DC=com,1001 CN=1002--DS,OU=Process,DC=dom,DC=ab,DC=com,1002 CN=1003--Cyb,OU=SA,OU=DGO,DC=dom,DC=ab,DC=com,1003 CN=Doe--Joe,OU=Adm,DC=dom,DC=ab,DC=com,d1004 CN=cruise--bob,OU=SA,O

我试图从python中的值字符串中提取列。值字符串如下所示-

CN=Unix ADISID,OU=SA,OU=DGO,DC=dom,DC=ab,DC=com,1001
CN=1002--DS,OU=Process,DC=dom,DC=ab,DC=com,1002
CN=1003--Cyb,OU=SA,OU=DGO,DC=dom,DC=ab,DC=com,1003
CN=Doe--Joe,OU=Adm,DC=dom,DC=ab,DC=com,d1004
CN=cruise--bob,OU=SA,OU=DGO,DC=dom,DC=ab,DC=com,d1005
现在,我想从这个字符串中提取列标题为CN、OU1、OU2、DC1、DC2、DC3、ID的列。每行中OU和DC值的数量不同,因此如果它们不在一行中,我想将该列保留为空。另外,我正在使用下面的一段代码来生成上面的字符串

result = l.search_s(base, ldap.SCOPE_SUBTREE, criteria, attributes)

results=""
for i in [entry for dn, entry in result if isinstance(entry, dict)]:
    results += str(i.get('distinguishedName')[0] +","+ i.get('sAMAccountName')[0] + "\n").replace("\, ","--")        
print results
如果我以列表的形式创建结果会更容易吗?

对于每一行:

pairs = [kv.split('=') for kv in line.split(',')]
for pair in pairs:
    if len(pair) == 1:
        pair.insert(0, 'ID')
现在你有了这样的东西:

[['CN', 'Unix ADISID'],
 ['OU', 'SA'],
 ['OU', 'DGO'],
 ['DC', 'dom'],
 ['DC', 'ab'],
 ['DC', 'com'],
 ['ID', '1001']]
然后:

这给了你:

{'CN': ['Unix ADISID'],
 'DC': ['dom', 'ab', 'com'],
 'ID': ['1001'],
 'OU': ['SA', 'DGO']}
要获得“字段留空”行为,您必须计算每个字段的最大数量。我相信CN是独一无二的,所以它应该永远是1

result = l.search_s(base, ldap.SCOPE_SUBTREE, criteria, attributes)

users = []

for i in [entry for dn, entry in result if isinstance(entry, dict)]:
    dn = i.get('distinguishedName')[0].replace('\, ', '--').split(',')
    info = collections.defaultdict(list)
    info['id'] = i.get('sAMAccountName')[0]

    for part in dn:
        key,value = part.split('=',1)
        info[key].append(value)

    users.append(info)

max_cn = max(map(lambda u: len(u['CN']), users))
assert max_cn == 1

max_ou = max(map(lambda u: len(u['OU']), users))
max_dn = max(map(lambda u: len(u['DN']), users))

numflds = max_cn + max_ou + max_dn

fields = []
for u in users:
    f = [u['CN']]
    ou = u['OU'] + [''] * max_ou
    f.extend(ou[:max_ou])
    dn = u['DN'] + [''] * max_dn
    f.extend(dn[:max_dn])
    f.append(u['id'])

你的预期产出是多少?您的问题似乎不够清楚。@Sаааааааааа如果您对该问题不清楚,请道歉。我想从字符串中的每一行提取列标题和相应的值。e、 g.从第一个类似CN、2 OU(OU1、OU2、OU3、OU4)、3 DC(DC1-DC4)和最后一个字段ID。由于OU3、OU4和DC4在第1行中没有值,它们的值应为空。希望这有意义?谢谢你的回复。我已尝试运行您提供的代码。但是获取一个错误
AttributeError:“list”对象在
part.split('=',1)
行没有属性“split”
。我明白错误是什么,但不明白你想做什么。你能详细说明一下吗?我的错。我认为这是在创建一个嵌套的iterable。我修补了代码。如果我最后打印f,我只会得到最后一条记录。你能告诉我缺失的部分是什么吗?由你决定。要么在循环中打印f,要么将其附加到字段中,或者做其他事情。但是f每次通过都会被重置,所以你必须在循环中执行。工作起来很有魅力!。非常感谢。我没有资格投票给你的答案,但我肯定会给你+100:-)
result = l.search_s(base, ldap.SCOPE_SUBTREE, criteria, attributes)

users = []

for i in [entry for dn, entry in result if isinstance(entry, dict)]:
    dn = i.get('distinguishedName')[0].replace('\, ', '--').split(',')
    info = collections.defaultdict(list)
    info['id'] = i.get('sAMAccountName')[0]

    for part in dn:
        key,value = part.split('=',1)
        info[key].append(value)

    users.append(info)

max_cn = max(map(lambda u: len(u['CN']), users))
assert max_cn == 1

max_ou = max(map(lambda u: len(u['OU']), users))
max_dn = max(map(lambda u: len(u['DN']), users))

numflds = max_cn + max_ou + max_dn

fields = []
for u in users:
    f = [u['CN']]
    ou = u['OU'] + [''] * max_ou
    f.extend(ou[:max_ou])
    dn = u['DN'] + [''] * max_dn
    f.extend(dn[:max_dn])
    f.append(u['id'])