2012-10-13 8 views
38

これは私が実行しているものよりも簡単でなければなりません。Pythonの正規表現をループすると一致します

ABC12DEF3G56HIJ7 

12 * ABC 
3 * DEF 
56 * G 
7 * HIJ 

にそして私は、私の人生のために、REGEXのマッチングを使用して、ループの正しいセットを設計することはできません:私の問題は、このようになります文字列を回しています。問題の要点は、 [A-Z]フラグメントの長さとフラグメントの長さを仮定することができないため、コードが完全に一般的でなければならないことです。 [0-9]フラグメントの長さ

ありがとうございました!

+2

' '' .join( "%sの*%sの\ nは" %(nは、wは)\ fI \ fIfindall(r '(?i)([az] +)(\ d +)'、input_string)) ' – jfs

答えて

72

Pythonのre.findallがうまくいくはずです。

Live demo

import re 

s = "ABC12DEF3G56HIJ7" 
pattern = re.compile(r'([A-Z]+)([0-9]+)') 

for (letters, numbers) in re.findall(pattern, s): 
    print(numbers, '*', letters) 
+2

うわー。とても簡単。これは美しく動作します。 – da5id

21

あなたがデータセット場合はre.finditerを使用することをお勧めし大きい:

import re 

s = "ABC12DEF3G56HIJ7" 
pattern = re.compile(r'([A-Z]+)([0-9]+)') 

for m in re.finditer(pattern, s): 
    print m.group(2), '*', m.group(1) 
+0

はい、これが良い方法です – kdubs

+0

私が間違っていないならば、この例の最後の行はOPの望ましい出力に合うように 'print m.group(2)、 '*'、m.group(1)'でなければなりません。私は 'm.group(0)'が完全なマッチ、すなわちABC12、DEF3、G56、HIJ7であると信じています。 – DaveL17

+0

@ DaveL17ありがとう、ありがとう。この回答を書いている間、私はあまり考えなかった。 – Mithril

関連する問題