2016-05-17 13 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

あなたは単純なリストの内包表記を使ってやりたいことができます:あなたは名前と年齢のための2つの値を摘み取るために、2つの正規表現の表現を必要としないすべての

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()) 

このループやリストの内包との主な違いは、ということです前者はパターンと一致しない文字列を処理できますが、リスト内包はパターンが常に一致することを前提としています(一致しなければ例外が発生します)。これはリストの解説で扱うことができますが、正規表現マッチを2回実行する必要があるので、パターンが一致するかどうかを確認してから実際の値を再度抽出する必要がありますので、醜い状態になります。この場合、私は明示的なforループがよりきれいだと思います。

関連する問題