2012-08-31 82 views
4

我有包括參數號的字符串_參數號:如何匹配字符串或字符開頭的Python

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.2090.999,所以我試圖將參數與字符串的開頭或下劃線匹配在一起:

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

這沒因某種原因工作。

有什麼建議嗎?謝謝!

回答

2

您的[^_]模式匹配任何字符不是下劃線

使用(..|..)分組,而不是:

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'] 
+0

這工作。謝謝!但是,你能解釋一下嗎?:實際上是這樣嗎? – user1638145

+0

@ user1638145:讓我們將事物分組,如正常括號,但內容不會被放入捕獲組。數字匹配組('(\ d。\ d *)')另一方面,* *捕獲並因此返回作爲第一個值;你已經使用'[0]'索引選擇了它。如果我沒有使用'?:'指標,你會爲每個匹配返回2個值:'''',''''或'['','1.8000']。例如,用於「a」。 –

+0

我想你需要在正則表達式的前面加上一個「r」......「r」(\ d + \。\ d *)''。 – jszakmeister

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' 
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)] 
+0

我會用int替換float。 Float在結尾添加數字,這不是他之後的確切結果。否則,這是一個非常pythonic這樣做的方式。 – Drahkar

+1

'int'不是一個好主意,因爲信息會因四捨五入而丟失。不過,我們可以跳過轉換爲一個數字(我會在一秒內編輯答案)。 –

0
(?P<param>[a-zA-Z]*)(?P<version>[^_]*) 
相關問題