在List:标记之后捕获用户名

时间:2013-08-06 19:08:16

标签: python

我正在尝试创建一个名为“userlist”的列表,其中列出了“List:”旁边的所有用户名, 我的想法是用“List:”解析该行,然后根据“,”进行拆分,并将它们放入列表中, 但是我无法捕捉这条线,关于如何实现这一点的任何输入?

output="""             alias: tech.sw.host
             name: tech.sw.host
            email: tech.sw.host
           email2: tech.sw.amss
             type: email list
   look_elsewhere: /usr/local/mailing-lists/tech.sw.host
             text: List tech SW team
  list_supervisor: <username>
             List: username1,username2,username3,username4,
                 : username5
          Members: User1,User2,
                 : User3,User4,
                 : User5 """
#print output
userlist = []
for line in output :
    if "List" in line:
        print line

5 个答案:

答案 0 :(得分:3)

如果是我,我会解析整个输入,以便轻松访问每个字段:

inFile = StringIO.StringIO(ph)
d = collections.defaultdict(list)

for line in inFile:
    line = line.partition(':')
    key = line[0].strip() or key
    d[key] += [part.strip() for part in line[2].split(',')]

print d['List']

答案 1 :(得分:0)

试试这个:

for line in output.split("\n"):
    if "List" in line:
        print line

当要求Python将字符串视为集合时,它会将该字符串中的每个字符视为该集合的成员(而不是每一行,这是您要完成的任务)。

您可以通过打印每一行来说明这一点:

>>> for line in ph:
...     print line
... 

a
l
i
a
s
:

t
e
...

顺便说一句,有更好的方法来处理这个问题。我建议看一下Python的内置RegEx库:http://docs.python.org/2/library/re.html

答案 2 :(得分:0)

在进行检查之前,请尝试使用strip()删除空格和断路器:

if 'List:' == line.strip()[:5]:

这应该捕获您需要的行,然后您可以使用split(',')提取用户名:

usernames = [i for i in line[5:].split(',')]

答案 3 :(得分:0)

使用regexstr.translatestr.split

>>> import re
>>> from string import whitespace
>>> strs = re.search(r'List:(.*)(\s\S*\w+):', ph, re.DOTALL).group(1)
>>> strs.translate(None, ':'+whitespace).split(',')
['username1', 'username2', 'username3', 'username4', 'username5']

你也可以在这里创建一个dict,它允许你访问任何属性:

def func(lis):
    return ''.join(lis).translate(None, ':'+whitespace)

lis = [x.split() for x in re.split(r'(?<=\w):',ph.strip(), re.DOTALL)]
dic = {}
for x, y in zip(lis[:-1], lis[1:-1]):
    dic[x[-1]] = func(y[:-1]).split(',')
dic[lis[-2][-1]] = func(lis[-1]).split(',')

print dic['List']
print dic['Members']
print dic['alias']

<强>输出:

['username1', 'username2', 'username3', 'username4', 'username5']
['User1', 'User2', 'User3', 'User4', 'User5']
['tech.sw.host']

答案 4 :(得分:0)

这是我的两个解决方案,基本相同,但第一个更容易理解。

import re

output = """   ... """

# First solution: join continuation lines, the look for List

# Join lines such as username5 with previous line
#             List: username1,username2,username3,username4,
#                 : username5
# becomes
#             List: username1,username2,username3,username4,username5
lines = re.sub(r',\s*:\s*', ',', output)

for line in lines.splitlines():
    label, values = [token.strip() for token in line.split(':')]
    if label == 'List':
        userlist = userlist = [user.strip() for user in values.split(',')]       
print 'Users:', ', '.join(userlist)


# Second solution, same logic as above
# Different means
tokens, = [line for line in re.sub(r',\s*:\s*', ',', output).splitlines() 
        if 'List:' in line]
label, values = [token.strip() for token in tokens.split(':')]
userlist = userlist = [user.strip() for user in values.split(',')]
print 'Users:', ', '.join(userlist)