我需要做的很简单,但我无法弄清楚如何。
我在列表中组织了很多字符串:
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 :(得分: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]
答案 2 :(得分: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循环更清晰。