我有一个由参数编号_参数编号组成的字符串:
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
和 0.999
,因此我尝试将参数与字符串的开头或下划线匹配:
num1 = float(re.findall('[^_]'+par+'(\d+\.\d*)', dir)[0])
由于某种原因无效。
有什么建议吗?谢谢!
答案 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']
答案 1 :(得分: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'
答案 2 :(得分: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)]
答案 3 :(得分:0)
(?P<param>[a-zA-Z]*)(?P<version>[^_]*)