0

私は他のさまざまな投稿を探し回っていますが、役立つヒントがいくつかありますが、私と同様の問題が見つからなかったので、質問しようと思いました. 次のリストを生成しました。

data2 = ['AN1_OUT,24','AN2_OUT,13','AN3_OUT,14','AN4_OUT,15']

私がやりたいのは、設定 (AN1_OUT など) とそれに付随する値 (2,13 など) を特定することです。この設定を知る必要があるだけなので、古き良き「if-elif」を使用して設定を正常に識別しましたが、値を分離する必要があります。これまでのところ、私は使用しています:

data3 = re.findall('[0-9]{2}',data2[i])
byte1 = map(lambda n: int(n[:2]),data3)

これは、data2 リスト (この例では 4) のすべての要素を処理する for ループにあります。「i」ごとに、次の結果が得られます。

[24]
[13]
[14]
[15]

これが私が期待することであることはわかっていますが、値が次のような1桁の場合に問題が発生します。

'AN1_OUT,2' 

この場合、その値を見逃してしまい、出力されません。data3 関数の正規表現を次のように変更してみました。

data3 = re.findall('[0-9]{1,2}',data2[i])

ただし、これの問題は、AN1_OUT、AN2_OUT などの数字を取得することです。そのため、次のようになります。

[1,2]
[2,13]
[3,14]
[4,15]

私はそれを解決するためにさまざまな方法を見てきましたが、それは非常にとらえどころのないものです。どんな助けでも大歓迎です。

4

3 に答える 3

2

最後に追加$して、入力文字列の最後でのみ一致するようにします。

'[0-9]{1,2}$'

\d代わりに使用できます[0-9]

'\\d{1,2}$'

エスケープを避けるには、生の文字列 ( r'raw string')を使用します。

r'\d{1,2}$'

>>> re.findall(r'\d{1,2}$', 'AN3_OUT,14')
['14']

>>> re.findall(r'\d+$', 'AN3_OUT,14')
['14']
于 2013-09-19T16:19:54.743 に答える
1

後ろ読みを使用して、カンマの後に続く数字を取得できます。また、より多くの桁数を持つことができる id[0-9]+の代わりに使用できます。[0-9]{1,2}

data3 = re.findall(r'(?<=,)[0-9]+',data2[i])
于 2013-09-19T16:21:16.403 に答える
0

正規表現を使用せずに、記述した文字列を解析できます。カンマで割るだけ!

for item in data2:
    setting, value = item.split(',')
    if setting == 'AN1_OUT':
        value = int(value)
        # do stuff with value
于 2013-09-19T16:36:58.493 に答える