我正在尝试创建一个名为“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
答案 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)
使用regex
,str.translate
和str.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)