2017-11-09 9 views
1

私は省略不要な文字

76/,2., 115., 12, 5/e12, .111 107,/1, 108/61a, f457f/3 11/150 

のような文字列を持っていると私は内側に以下の値を見つけるしたいと思います:

76/2, 115, 12, 5/12, 111, 107/1, 108/61, 457/3 and 11/150 

注意、107,/1のために私は107/1をしたいというのが、 107, /1の場合1071があり、76/,2と同じです。 私はthis regexで試してみましたが、結果の中にスラッシュ文字を数字だけと(もしあれば)保持する方法はわかりません。

それは可能ですか?結果を繰り返して、それぞれに不要な文字が含まれているかどうかを確認して削除することができますが、それを行うための正規表現の方法を見つけることを望みました。代わりにもつれた正規表現パターンを発明の

+1

あなたは、あなただけの単一の正規表現マッチング操作で必要な結果を得ることができません。ここでいくつかの後処理ステップを使用する必要があります。 –

+0

アイテム間に 'と'の単語を追加することは必須ですか? – RomanPerekhrest

+1

['[^ \ d \ s] *(\ d +)(?:\^d \ s /] *(\)[^ \ d \ s] *(\ d +))?[^ \ s \ d ] * '$ 1 $ 2 $ 3'で置き換え]](https://regex101.com/r/NAxUuk/1)? – ctwheels

答えて

2

ストレートフォワードre.sub()ソリューションを検討:

import re 

s = '76/,2., 115., 12, 5/e12, .111 107,/1, 108/61a, f457f/3 11/150' 
result = re.sub(r'\S+[^,\s](,)?', 
       lambda m: re.sub(r'[^\d/]+', '', m.group()) + (m.group(1) or ''), s) 

print(result) 

出力:

76/2, 115, 12, 5/12, 111 107/1, 108/61, 457/3 11/150 

を----------

必要な値の一覧を取得するには、上記を短縮して:

s = '76/,2., 115., 12, 5/e12, .111 107,/1, 108/61a, f457f/3 11/150' 
result = re.sub(r'\S+', lambda m: re.sub(r'[^\d/]+', '', m.group()), s).split() 

print(result) 

出力:あなたが望むマッチは(文字列には、 `76/2 'が存在しない)連続していないので、

['76/2', '115', '12', '5/12', '111', '107/1', '108/61', '457/3', '11/150'] 
+0

リストは私の望む出力です、ありがとうございます。これはきちんとした解決策です。 – adamczi

+0

@adamczi、ようこそ – RomanPerekhrest