我给了逗号分隔的总统名字,其中包含以下一些细节:
James Earl Carter, Jr., 1977-1981, Democrat
Ronald Wilson Reagan, 1981-1989, Republican
George Herbert Walker Bush, 1989-1993, Republican
现在我想要三个这样的列表:
Name = ['Carter' , 'Reagan' , 'Bush']
StartYears = [1977,1981,1989]
EndYears = [1981,1989,1993]
Party = ['Democrat','Republican','Republican']
但是面临一些问题:
James Earl Carter, Jr. contains comma already so splitting is not working properly.
怎么做?请帮忙。
答案 0 :(得分:4)
从您的数据集看起来,只有名称中可以包含,
,其他人则不会,因此您可以使用从后面拆分的rsplit
函数,并将其赋予参数{{1 }和','
,这意味着使用逗号从后面拆分并在2次拆分时停止。
示例 -
2
此外,如果对于s = "James Earl Carter, Jr., 1977-1981, Democrat".rsplit(',',2)
print(s)
>> ['James Earl Carter, Jr.', ' 1977-1981', ' Democrat']
列表,条件是在没有name
的情况下选择列表中的姓氏,或者如果有逗号,请在第一个逗号之前选择姓氏。一个简单的解决方案是使用','再次拆分名称列表,这次正常,
函数应该执行,然后取第一个元素(如果没有逗号,则只有一个元素),然后使用split(',')
[ - 1]`索引再次按空格分割。
示例 -
split(' ') and then get the last element using
答案 1 :(得分:1)
使用zip
函数和基于positive look-ahead的正则表达式:
>>> s="""James Earl Carter, Jr., 1977-1981, Democrat
... Ronald Wilson Reagan, 1981-1989, Republican
... George Herbert Walker Bush, 1989-1993, Republican"""
>>>
>>> list(zip(*[re.findall(r'\w+(?=[,-]|$)',i) for i in s.split('\n')]))
[('Carter', 'Reagan', 'Bush'),
('1977', '1981', '1989'),
('1981', '1989', '1993'),
('Democrat', 'Republican', 'Republican')]
以下正则表达式:
r'\w+(?=[,-]|$)'
会找到,
或-
之前或字符串末尾的单词字符组合。
如果您要处理较长的列表,我建议使用itertools.zip_longest()
,这更适合此类问题,并且当您的列表没有相同的列号时也很好。它还接受fillvalue
用于填充缺失列的参数:
>>> s="""James Earl Carter, Jr., 1977-1981, Democrat,anothername,12222
... Ronald Wilson Reagan, 1981-1989, Republican,33453
... George Herbert Walker Bush, 1989-1993, Republican"""
>>> from itertools import zip_longest
>>> list(zip_longest(*[re.findall(r'\w+(?=[,-]|$)',i) for i in s.split('\n')],fillvalue='**'))
[('Carter', 'Reagan', 'Bush'),
('1977', '1981', '1989'),
('1981', '1989', '1993'),
('Democrat', 'Republican', 'Republican'),
('anothername', '33453', '**')]
>>>
请注意,在这两种情况下,如果您想迭代izip_longest
或zip
的结果,则无需致电list
。这只是为了展示结果!
答案 2 :(得分:0)
如果您想使用re
# Assume: s = 'James Earl Carter, Jr., 1977-1981, Democrat'
reg = re.compile('(\w+\s+)*(?P<name>\w+),\D*(?P<startyear>\d+)-(?P<endyear>\d+),\s*(?P<party>\w+)')
m = reg.search(s)
Name.append(m.group('name'))
StartYears.append(m.group('startyear'))
EndYears.append(m.group('endyear'))
Party.append(m.group('party'))
答案 3 :(得分:0)
您可以使用正则表达式来实现此目的。考虑到你想避免在名称之间使用逗号,我已经用了几年时间先拆分字符串,然后将第一部分作为名称处理,然后处理第二部分作为聚会。
search_string = """James Earl Carter, Jr., 1977-1981, Democrat
Ronald Wilson Reagan, 1981-1989, Republican
George Herbert Walker Bush, 1989-1993, Republican"""
import re
Name=[]
StartYears=[]
EndYears=[]
Party=[]
year = re.compile("[\d]{4}-[\d]{4}")
for i in search_string.split("\n"):
split_string = year.search(i).group(0)
l = i.split(split_string)[0].split(",")[0].split()
Name.append(l[-1])
StartYears.append(split_string.split("-")[0])
EndYears.append(split_string.split("-")[1])
Party.append(i.split(split_string)[1].split(",")[1].strip())
print Name
print StartYears
print EndYears
print Party
答案 4 :(得分:0)