首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在pandas中使用正则表达式进行匹配

无法在pandas中使用正则表达式进行匹配
EN

Stack Overflow用户
提问于 2019-09-19 17:17:51
回答 2查看 44关注 0票数 0

您好,我有一个如下所示的dataframe,我需要匹配一个后面跟着其单位的数字,并且只返回数字

我有,毫升,加仑,l等单位

输入:

代码语言:javascript
运行
复制
   text                                       
   1234567-CAR WA GK5 9x78x90 12L              

   3456789 TOP-L BD3 195x169x62 TopL           

预期输出:

代码语言:javascript
运行
复制
   text                                        extract              Return
   1234567-CAR WA GK5 9x78x90 12L              12L                  12

   3456789 TOP-L BD3 195x169x62 TopL           -                    -

代码:

代码语言:javascript
运行
复制
  def names(header):

       if re.search('([0-9]+(\.[0-9]*|)(\s|[a-z]*)(\s|[a-z]*)(\s|)ml)',header):
          pos_start = re.search('([0-9]+(\.[0-9]*|)(\s|[a-z]*)(\s|[a-z]*)(\s|)ml)', header).start()
          pos_end = re.search('([0-9]+(\.[0-9]*|)(\s|[a-z]*)(\s|[a-z]*)(\s|)ml)', header).end()
          return header[pos_start:pos_end]  


       elif re.search('((\d*)l)',header):
          pos_start = re.search('((\d*)l)', header).start()
          pos_end = re.search('((\d*)l)', header).end()
          return header[pos_start:pos_end] 


 def measure(val):

    ml=['ml','ML','mL','Ml']
    l=['l','L','Lt','lt']


    if any(x in val for x in ml):
        return float(re.findall('(\d+\.\d+|\d+)', val)[0])

    if any(x in val for x in l):
        return float(re.findall('(\d+\.\d+|\d+)', val)[0])*1000   

df_result = pd.concat([df['A'],df['text'],df['B'],df['text'].apply(names),(df['text'].apply(names)).dropna().apply(measure)],axis=1)

错误:

代码语言:javascript
运行
复制
    ---> 22 return float(re.findall('(\d+\.\d+|\d+)', val)[0])*1000



         IndexError: list index out of range
EN

回答 2

Stack Overflow用户

发布于 2019-09-19 17:42:10

代码语言:javascript
运行
复制
def measure(val):
    header_l = header.lower()
    m = re.match(`(\d+(\.\d+)?)(m?[illi]*l[iters]*)`, header_l, re.IGNORECASE)
    if m:
        as_ml = 1 if m.group(3).startswith('m') else 1000
        return float(m.group(1)) * as_ml
    return None
票数 0
EN

Stack Overflow用户

发布于 2019-09-19 21:19:26

看看这对你是否有效

代码语言:javascript
运行
复制
df['extract']= [val[-1] for val in df['text'].str.split()]
df['Return']=df['extract'].str.extract(r'(\d+)').fillna('-')
print(df)

                               text     extract     Return
0   1234567-CAR WA GK5 9x78x90 12L      12L          12
1   3456789 TOP-L BD3 195x169x62 TopL   TopL         -
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58007676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档