2017-09-27 1 views
0

文字列内のすべての一致を置換し、一致の配列も取得したいと考えています。ここでPython正規表現:1回のパスでマッチを置き換えて返しますか?

は、2つの機能でそれを行う方法は次のとおりです。

str = "foo123bar456" 
nums = re.findall(r'\d+', str) 
str = re.sub(r'\d+', '', str)  

しかし、これは二回、不必要に文字列を通過します。どのようにして1回のパスでこれを行うことができますか?

答えて

1

re.subでは、引数replは文字列を返す関数にすることができます。私たちは、リストに試合を追加するためにこれを使用することができます:

import re 


def substitute(string): 
    def _sub(match): 
     matches.append(match) 
     return '' 

    matches = [] 
    new_string = re.sub(r'\d+', _sub, string) 
    return new_string, matches 


print(substitute('foo123bar456')) 
> ('foobar', [<_sre.SRE_Match object; span=(3, 6), match='123'>, <_sre.SRE_Match object; span=(9, 12), match='456'>]) 
2

re.subでラムダ関数を使う:

>>> str = "foo123bar456" 
>>> arr=[] 
>>> print re.sub(r'(\d+)', lambda m: arr.append(m.group(1)), str) 
foobar 
>>> print arr 
['123', '456'] 
+0

はい、ありがとうございます。あなたのソリューションとPacoはどちらも有効ですが、私は個人的にラムダに対して明示的な関数定義を好むので、Pacoのソリューションを選択しました。 – Agargara

関連する問題