4

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

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
4

5 回答 5

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']
于 2013-08-06T19:17:47.823 回答
0

在进行检查之前尝试使用strip()删除空格和换行符:

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

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

usernames = [i for i in line[5:].split(',')]
于 2013-08-06T19:16:46.033 回答
0

使用regex,str.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']

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

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']
于 2013-08-06T19:17:26.050 回答
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

于 2013-08-06T19:14:16.203 回答
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)
于 2013-08-06T20:00:58.543 回答