2017-03-29 11 views
0

私はこの "2a3bc"のような文字列をPythonで "aabbbc"にデコードしようとしています。ですから、私が最初にやるべきことは、それを意味のあるグループでリストに分割することです。言い換えれば:['2a','3b','c']文字列を数字と文字または単一の文字のグループに分割する

本質的に、(1)数字と文字、または(2)単なる文字と一致します。

re.findall('\d+\S|\s', '2a3bc') 

をし、それが返されます:

私はこれを持って

['2a', '3b'] 

は、だから、実際にcが欠落しています。

おそらく、私の正規表現のスキルが不足している可能性があります。

+0

http://stackoverflow.com/questions/26006949/python-expanding-a-string-of-variables-with-integers and http://stackoverflow.com/questions/35003123/fairly-basic-string-expansion -in-python – TessellatingHeckler

+0

@TessellatingHecklerありがとう、私は "拡張"または "拡張"という言葉を使用するとは考えていませんでした。しかし、私はすでに30分近くを探しました。 – adrianmc

答えて

5

現在の式は、小さなバグ修正:\Sは空白ではなく、\sは空白です。あなたはどちらの場合も、非空白を探しているので、あなたはどこでも\sを使用しないでください。

>>> re.findall(r'\d+\S|\S', '2a3bc') 
['2a', '3b', 'c'] 

しかし、この式は短くすることができます:代わりに1桁以上の数字のために+を使用しての、ゼロのため*を使用しますグループには数字の前に数字が表示されていない可能性があります。文字、数字、さらには句読点が含まれて -

>>> re.findall(r'\d*\S', '2a3bc') 
['2a', '3b', 'c'] 

は再び、しかし、 \Sは、単に非空白であることに注意してください。 \D(非数字)にも同様の問題があります。数字は除外されますが、句読点は含まれます。このため、最短、明確な正規表現は、その後、英数字を示している、 \w\Sに代わる:

>>> re.findall(r'\d*\w', '2a3bc') 
['2a', '3b', 'c'] 

グループ内の他の文字クラスがすでに桁ですので、この特定の\wは文字だけにマッチします。

関連する問題