【问题标题】:Regular expression extracting number dimension正则表达式提取数字维度
【发布时间】:2017-11-17 06:07:10
【问题描述】:

我正在使用 python 正则表达式从数据库中提取维度信息。该列中的条目如下所示:

23 cm
43 1/2 cm

20cm
15 cm x 30 cm

我需要的只是条目的宽度(因此对于带有“x”的条目,只有第一个数字),但正如您所见,值到处都是。

根据我在documentation 中的理解,您可以使用他们的位置访问匹配中的组,所以我想我可以根据返回的组数和每个组的内容来确定条目的类型索引。

我目前使用的表达式是^(\d{2})\s?(x\s?(\d{2}))?(\d+/\d+)?$,但它并不完美,它返回了许多无用的组。有没有更有效更合适的方法?

编辑:我需要每一行的数字。当只有一个数字时,暗示只测量了宽度(包括任何小数部分,例如第 2 行)。当有两个数字时,也测量了高度,但我只需要第一个数字的宽度(例如最后一行)

【问题讨论】:

  • 你想要单位 (cm) 还是只想要数值?
  • 这些是您能遇到的唯一值示例,还是可以与其他数据混合使用?例如您的字符串是否总是以数字开头并且除了这些尺寸之外不包含其他任何内容?
  • 为什么这个43 1/2 和其他的不一样?或者只是^(?:(?!cm).)+
  • 这些似乎是数据集中唯一的变化。 @sln 1/2 表示 43.5。不幸的是,给我数据的人并不真正关心格式化它。
  • @ShammelLee 只是数值

标签: python regex csv numbers data-processing


【解决方案1】:

以下是如何从文本文件中执行此操作的示例。 它适用于提供的数据。

     f = open("textfile.txt",r')

     for line in f :
         if 'x'in line:
             iposition = line.find('x')
             print(line[:iposition])

【讨论】:

    【解决方案2】:

    尝试下面的正则表达式,它将捕获第一个数字和可选的小数,在第一个'cm'之前出现

    import re
    regex = re.compile('(\d+.*?)\s?cm') # this will works for all your example data
    # or
    # this asserted whatever come after the 1st digit group must be fractional number only
    regex = re.compile('(\d+(?:\s+\d+\/\d+)?)\s?cm') 
    
    
    >>> regex.match('23 cm').group(1)
    >>> '23' 
    >>> regex.match('43 1/2 cm').group(1)
    >>> '43 1/2'
    >>> regex.match('20cm').group(1)
    >>> '20'
    >>> regex.match('15 cm x 30 cm').group(1)
    >>> '15'
    

    regex101 demo

    【讨论】:

      【解决方案3】:

      这个正则表达式应该可以工作 (Live Demo)

      ^(\d+)(?:\s*cm\s+[xX])
      

      说明

      • ^(\d+) - 在行首至少捕获一位数字
      • (?: - 启动非捕获组
      • \s* - 后跟至少零个空格字符
      • cm - 后跟文字 cm
      • \s+ - 后跟至少一个空格字符
      • [xX] - 后跟文字 xX
      • ) - 结束非捕获组

      您不必费心匹配该行的其余部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多