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

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

改用 a (..|..) 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

没有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 回答
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
(?P<param>[a-zA-Z]*)(?P<version>[^_]*)
于 2012-08-31T13:10:11.503 回答