python - 从 Pandas 系列中提取体积信息 - Pandas , Regex

标签 python regex pandas

我有一个可以通过以下代码生成的 Pandas 系列:

输入:

l = ['abcd 1942 Lmauu 40% 70cl',
    'something again something   1.5 L',
    'some other stuff 45% 70 CL',
    'not the exact data      3LTR',
    'abcd 100Ltud 6%(8)500ML',
    'cdef  6%(8)500 ml',
    'a packet 24 x 27.5 cl (  PET )']
ser = pd.Series(l)

问题陈述和预期输出:

我正在尝试从系列中提取体积并转换为数据帧,这样体积将在数据帧的 1 列中,而在另一列中是度量单位,可以使用以下代码重现预期输出:
d = {0: {0: '70',
     1: '1.5',
     2: '70',
     3: '3',
     4: '500',
     5: '500',
     6: '27.5'},
     1: {0: 'cl', 1: 'L', 2: 'CL', 3: 'LTR', 4: 'ML', 5: 'ml', 6: 'cl'}}
expected_output = pd.DataFrame(d)

      0    1
0    70   cl
1   1.5    L
2    70   CL
3     3  LTR
4   500   ML
5   500   ml
6  27.5   cl 

我的试用码

这是我尝试过的,我已经非常接近我想要的但不完全是,如果你看到我没有得到最后一卷。我想是因为我已经包含了 $在我的正则表达式中,但如果没有它,我将无法解析此字符串中的音量,例如 abcd 1942 Lmauu 40% 70cl , 1942 L会被退回。另外,我只想要第二列中的度量单位,而不是输出中显示的第一列,但这是次要的。
print(ser.str.extract(r'((?i)([\d]+?[.])?\d+?[\s+]?(cl$|ml$|ltr$|L$)(?:$))').iloc[:,[0,-1]]) 

        0    2
0    70cl   cl
1   1.5 L    L
2   70 CL   CL
3    3LTR  LTR
4   500ML   ML
5  500 ml   ml
6     NaN  NaN 

请建议我应该在这里做什么。

最佳答案

您可以使用

r'(?i)\b(\d+(?:\.\d+)?)\s*(cl|ml|ltr|L)\b'

regex demo .

详情
  • (?i) -
  • 上的不区分大小写模式
  • \b - 一个词边界
  • (\d+(?:\.\d+)?) - 捕获组 1:一个或多个数字后跟一个点和一个或多个数字的可选序列
  • \s* - 0+ 个空格
  • (cl|ml|ltr|L) - cl , ml , ltrL (注意不区分大小写的匹配)
  • \b - 一个词边界

  • 测试:
    >>> ser.str.extract(r'(?i)\b(\d+(?:\.\d+)?)\s*(cl|ml|ltr|L)\b', expand=True)
          0    1
    0  70    cl 
    1  1.5   L  
    2  70    CL 
    3  3     LTR
    4  500   ML 
    5  500   ml 
    6  27.5  cl
    

    关于python - 从 Pandas 系列中提取体积信息 - Pandas , Regex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61041224/

    相关文章:

    python - spaCy v3 基于现有模型训练 NER 或将自定义训练的 NER 添加到现有模型

    python - 显示 403 模板而不是 404

    python - 筛选小于另一个日期的最大日期

    python - 隐藏 Unresolved 导入错误

    python - 如何在一行中计算数据框中的并发事件?

    python - 如何在Python中有效地搜索和访问数据框中的某些单元格?

    python - Pandas left join 给出 NaN

    javascript - 使用Javascript将文本中的多个斜杠替换为单个斜杠

    regex - 使用RegEx获取输入页面的错误处理

    c++ - 匹配C语言数字的正则表达式