6

パラメータ番号 _ パラメータ番号で構成される文字列があります。

dir = 'a1.8000_b1.0000_cc1.3000_al0.209_be0.209_c1.344_e0.999'

選択したパラメーターの背後にある番号を取得する必要があります。つまり、

  • par='be'--> 0.209 が必要
  • par='e'-->0.999が必要

私は試した:

num1 = float(re.findall(par + '(\d+\.\d*)', dir)[0])

しかし、par='e'これは0.209 and 0.999と一致するため、パラメーターを文字列の先頭またはアンダースコアと一緒に一致させようとしました:

num1 = float(re.findall('[^_]'+par+'(\d+\.\d*)', dir)[0])

何らかの理由で機能しませんでした。

助言がありますか?ありがとうございました!

4

4 に答える 4

4

パターンは、アンダースコア以外の任意の文字と[^_]一致します。

代わりに(..|..) orグループ化を使用します。

float(re.findall('(?:^|_)' + par + r'(\d+\.\d*)', dir)[0])

(?:..)元のグループ インデックスに干渉しないように、非キャプチャ グループを使用しました。

デモ:

>>> import re
>>> dir = 'a1.8000_b1.0000_cc1.3000_al0.209_be0.209_c1.344_e0.999'
>>> par = 'e'
>>> re.findall('(?:^|_)' + par + r'(\d+\.\d*)', dir)
['0.999']
>>> par = 'a'
>>> re.findall('(?:^|_)' + par + r'(\d+\.\d*)', dir)
['1.8000']

詳しく説明すると、文字グループ ( [..])を使用し、そのグループをキャレット ( ) で開始^すると、文字グループが反転し、リストされた文字の一致から他のすべての文字の一致に変わります。

>>> re.findall('[a]', 'abcd')
['a']
>>> re.findall('[^a]', 'abcd')
['b', 'c', 'd']
于 2012-08-31T08:54:52.557 に答える
0
(?P<param>[a-zA-Z]*)(?P<version>[^_]*)
于 2012-08-31T13:10:11.503 に答える
0

正規表現を使用しないソリューション:

>>> def get_value(dir, parm):
...     return map(float, [t[len(parm):] for t in dir.split('_') if t.startswith(parm)])
... 
>>> get_value('a1.8000_b1.0000_cc1.3000_al0.209_be0.209_c1.344_e0.999', "be")
[0.20899999999999999]

文字列内にパラメータが複数回出現する場合は、それらすべてが評価されます。

そしてフロートにキャストしないバージョン:

return [t[len(parm):] for t in dir.split('_') if t.startswith(parm)]
于 2012-08-31T09:13:04.013 に答える
0

解決策なしregex:

def func(par,strs):
    ind=strs.index('_'+par)+1+len(par)
    ind1=strs.find('_',ind) if strs.find('_',ind)!=-1 else len(strs)
    return strs[ind:ind1]

出力:

>>> func('be',dir)
'0.209'
>>> func('e',dir)
'0.999'
>>> func('cc',dir)
'1.3000'
于 2012-08-31T09:12:03.783 に答える