2016-05-17 181 views
1

我需要做的事很简单,但我无法弄清楚如何做。Python - 创建包含多个子列表的列表

我有很多的名单组织的字符串:

list = ['my name is Marco and i'm 24 years old', 'my name is Jhon and i'm 30 years old'] 

我使用正则表达式从列表中的每个元素提取信息:

for element in list: 
    name = re.findall('my name is (.*?) and i\'m', element, re.DOTALL)[0] 
    age = re.findall('and i\'m (.*?) years old', element, re.DOTALL)[0] 

现在我想做的是重新编译一个新的列表,它具有由名称和年龄组成的元素子列表。

例子:

for element in newlist: 
    name = element[0] 
    age = element[1] 

是否有可能做这样的事情?

+0

是的,这是可能的,非常简单。看到下面的答案,我已经更新了你的代码 –

回答

1

以下是完全按照您的需要完成的解决方案。这将创建一个包含名称和年龄的子列表的新列表。

new_list = [] 
for element in list: 
    name = re.findall('my name is (.*?) and i\'m', element, re.DOTALL)[0] 
    age = re.findall('and i\'m (.*?) years old', element, re.DOTALL)[0] 
    new_list.append([name, age]) 
1

你可以做你想做什么用一个简单的列表理解:

所有的
name_pat = re.compile('my name is (.*?) and i\'m', re.DOTALL) 
age_pat = re.compile('and i\'m (.*?) years old', re.DOTALL) 

new_list = [[name_pat.findall(elem)[0], age_pat.findall(elem)[0]] for elem in your_list] 
1

首先,你不需这两个正则表达式来挖出的姓名和年龄两个值。

>>> s = "my name is Marco and i'm 24 years old" 
>>> pattern = r"my name is\s+(.+)\s+and i'm\s+(\d+)\s+years old" 
>>> m = re.match(pattern, s) 
>>> print(m.groups()) 
('Marco', '24') 

你也可以使用列表理解来构建新的列表:

>>> data = ["my name is Marco and i'm 24 years old", "my name is Jhon and i'm 30 years old"] 
>>> new_list = [re.match(pattern, s).groups() for s in data] 
>>> print(new_list) 
[('Marco', '24'), ('Jhon', '30')] 

结果是元组列表。如果你真的需要一个列表的列表,你可以这样做:

new_list = [list(re.match(pattern, s).groups()) for s in data] 

列表内涵是这个循环手短:

new_list = [] 
for s in data: 
    m = re.match(pattern, s) 
    if m: 
     new_list.append(m.groups()) 

这个循环,列表理解之间的主要区别在于,前者可以处理与模式不匹配的字符串,而列表理解则假定该模式始终匹配(如果不匹配,将导致异常)。你可以在列表理解中处理这个问题,但是,它会变得很难看,因为你需要执行两次正则表达式匹配:一次检查模式匹配,然后再次提取实际值。在这种情况下,我认为明确的for循环更清晰。