2012-03-26 22 views
1

文字列がある場合s = "Name: John, Name: Abby, Name: Kate"Name:,の間のすべてを抽出するにはどうすればいいですか?だから私は配列を持っていると思いますa = John, Abby, Kate文字列の後の正規表現抽出要素

ありがとう!

答えて

3

正規表現は必要ない:

>>> s = "Name: John, Name: Abby, Name: Kate" 
>>> [x[len('Name: '):] for x in s.split(', ')] 
['John', 'Abby', 'Kate'] 

あるいは:

>>> prefix = 'Name: ' 
>>> s[len(prefix):].split(', ' + prefix) 
['John', 'Abby', 'Kate'] 

は今、あなたはまだ正規表現の方が適切であると思われる場合:

>>> import re 
>>> re.findall('Name:\s+([^,]*)', s) 
['John', 'Abby', 'Kate'] 
1

興味深い質問がどのようですあなたはPythonでこれを行う多くの方法の中から選択します。あなたがフォーマットが正確であると確信しているならば、 "分割"を使った答えはいいです。軽度の書式変更から保護したい場合は、正規表現が便利です。フォーマットのどの部分が安定しているかを考え、正規表現でそれらを捕捉し、他の部分に柔軟性を残すべきです。ここでは名前がアルファベットであると仮定している例があり、単語「名前」とコロンは安定していること:

import re 
s = "Name: John, Name: Abby, Name: Kate" 
names = [i.group(1) for i in re.finditer("Name:\s+([A-Za-z]*)", s)] 
print names 

があなたの代わりに名前内部ハイフンやその他の文字を許可したい場合があります。 [A-Za-z]の中のテキストを変更することでそれを行うことができます。

多くの例を持つPython正規表現についての良いページはhttp://docs.python.org/howto/regex.htmlです。

+0

リストの理解は 're.findall(" Name:\ s +([A-Za-z] *) "、s)' –

+0

とまったく同じです。私はfindallを使うことを考えました。私は個人的にfinditerをもっと頻繁に使っています。なぜなら、仕事は見つけられた要素ごとに何かを行うことなので、ここでlistinderを使うのは少し奇妙ですが、例ではfinditerを使うことにしました。 –

1

さらにいくつかの方法が

>>> s 
'Name: John, Name: Abby, Name: Kate' 

方法それを行う1:

>>> [x.strip() for x in s.split("Name:")[1:]] 
['John,', 'Abby,', 'Kate'] 

方法2:

>>> [x.rsplit(":",1)[-1].strip() for x in s.split(",")] 
['John', 'Abby', 'Kate'] 

方法3:

>>> [x.strip() for x in re.findall(":([^,]*)",s)] 
['John', 'Abby', 'Kate'] 

方法4:トークンと実際の名前:

>>> [x.strip() for x in s.replace('Name:','').split(',')] 
['John', 'Abby', 'Kate'] 

また、私は常に一貫して「名前」の間に複数のスペース自分のことができるならば理にかなってストリップを適用する方法、注意してください。

方法2と3はより一般的な方法で使用できます。

関連する問題