2017-04-03 3 views
1

の一環として、私は、文字列を持っている複数の出現箇所を見つけるなどのようになります。この場合大きなパターン

string = 0.033 0.0331 
string2 = 0.0022e+002 123.4 

は、番号のリストは、両方の文字列のための2つであるが、これは一つ以上のことができます。

文字列と数字を一致させて、数字を使用してリストに入れたいと思います。しかし、私はすべての個々の数字に一致するように見えることはできません。私は、次の正規表現(入力例としての文字列)を使用します。

matchNum = re.findall(r'(\S+)\s*=\s*((\d+\.?\d*e?[+-]?\d*)\s*)+', 'string2 = 0.0022e+002 123.4') 

しかし、これは唯一なように、文字列と最後の数(2回)を返します:

[('String2', '123.4\n', '123.4')] 

私はことができるだろうか任意のアイデアをこれを得るには:

[('String2', '0.0022e+002', '123.4')] 

前述のように、1つ以上の数字がある場合もありますが、常に1つの文字列が前面に表示されます。

答えて

1

あなたは、グループ2に=後1群 一部に=前部分を捕捉する、最初の一致を収集することができます数を抽出するためだけに2番目の正規表現を使用してください。ここでは、任意の特定の要件に合わせてさらに調整することができるということスニペットは次のとおりです。

import re 
s = 'string2 = 0.0022e+002 123.4' 
r1 = re.compile(r'(\S+)\s*=\s*((?:(?:-?\d+\.?\d*(?:e[+-]?\d+)?)\s*)+)', re.I) 
r2 = re.compile(r'-?\d+\.?\d*(?:e?[+-]?\d+)?', re.I) 
matches = r1.finditer(s) 
res = [] 
for x in matches: 
    tmp = [x.group(1)] 
    tmp.extend(r2.findall(x.group(2))) 
    res.append(tmp) 
print(res) 

r1正規表現は、あなたが必要なすべてのデータとの一致を見つけ、r2はから必要な数値を抽出しますPython demo

を参照してください。グループ2にはマッチがある。

0

はたぶん、あなたは引数を置くことができます[1] string2の背後にある...

matchNum = re.findall(R '(\ S +)\ \ sの*((* = S \ D +。?\ D E?[+ - ]?。\ dは)\は、*)+ S」、 'string2の[1] = 0.0022e + 002、123.4'

とコンマを追加 私はそれが動作を期待します

0

このようなMabye:

import re 

s = """ 
string = 0.033 0.0331 
string2 = 0.0022e+002 123.4 
string3 = 0.8291 
""" 

rgx = re.compile(r'([^ \n]*) *= *([^ ]+) *([^ \n]+)?') 
for x in rgx.finditer(s): 
    print x.groups() 

# ('string', '0.033', '0.0331') 
# ('string2', '0.0022e+002', '123.4') 
# ('string3', '0.8291', None) 

print tuple(x for x in x.groups() if x)は、Noneが不要な場合に使用できます。

[編集]数の任意の量をサポートする別のaproach:

s = """ 
string = 0.033 0.0331 
string2 = 0.0022e+002 123.4 
string3 = 0.8291 
string4= 0.1 0.2 0.3 0.4 0.5 
""" 

rgx = re.compile('[^ \n=]+') 
print [rgx.findall(l) for l in s.splitlines() if l] 

# [['string', '0.033', '0.0331'], ['string2', '0.0022e+002', '123.4'], 
# ['string3', '0.8291'], ['string4', '0.1', '0.2', '0.3', '0.4', '0.5']] 
関連する問題