如何在Python中匹配字符串或字符的开头

如何在Python中匹配字符串或字符的开头,python,regex,findall,Python,Regex,Findall,我有一个由参数编号u参数编号组成的字符串: 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,因此我尝试将参数与字符串开头或下划线匹配

我有一个由参数编号u参数编号组成的字符串:

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])
因为某种原因,它不起作用


有什么建议吗?谢谢大家!

您的
[^\u]
模式匹配任何非下划线的字符

使用
(..|…)
或分组:

float(re.findall('(?:^|_)' + par + r'(\d+\.\d*)', dir)[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'

不带正则表达式的解决方案:

>>> 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)]
(?P[a-zA-Z]*)(?P[^]*)

这很有效。非常感谢。但是你能解释一下吗?:实际上是做什么的?@user1638145:让我们像普通括号一样分组,但是内容不会被放入捕获组。另一方面,数字匹配组(
(\d.\d*)
)进行捕获,因此作为第一个值返回;您已使用
[0]
索引选择了它。如果我没有使用
?:
指示符,您将为每个匹配返回两个值:
['''''u',0.999']
用于
'e'
,或者
[''1.8000']
用于
'a'
,例如,我认为您需要在正则表达式的部分前面加上一个“r”<代码>r'(\d+\.\d*)。太好了!借助非捕获括号,我们可以显式地指向字符串或另一个字符序列的开头。我将用int替换float。float将数字添加到末尾,这与他所追求的结果不同。否则,这是一种非常好的方法。
int
不是一个好主意,因为由于舍入,信息会丢失。尽管如此,我们还是可以跳过对数字的转换(我马上编辑答案)。
>>> 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)]
(?P<param>[a-zA-Z]*)(?P<version>[^_]*)