【问题标题】:Python: no results using regular expressionPython:使用正则表达式没有结果
【发布时间】:2014-09-16 16:49:29
【问题描述】:

我有一个包含许多行的文本文件,例如:

Total:4CASES      gross weight(KG):76          net weight(KG):60          volume(CBM):0.99
Total:203CASES    gross weight(KG):16695.88    net weight(KG):15329.37    volume(CBM):99.29
Total:198CASES    gross weight(KG):14892.25    net weight(KG):13347.77    volume(CBM):105.14
Total:231CASES    gross weight(KG):18730.56    net weight(KG):16825.96    volume(CBM):112.77

我正在尝试提取数字并获取案例、重量和体积的总和。

对于所有案例,我在文件的每一行都使用以下表达式:

matchTotalCases = re.search(r'Total:\w*CASES\s', line)

当我去matchTotalCases.group() 时,它给了我Total:4CASES 第一行。这对我来说没问题,但我正在尝试总重量:

matchGrossWeight = re.search(r'^gross\sweight(KG):\w*[.]?[\w]*$', line)

但它没有返回任何东西......

那么我该如何调整我的正则表达式,以便得到像 gross weight(KG):76 甚至更好的结果,直接只有 76?

感谢您的支持。

【问题讨论】:

  • 正则表达式中的 ^ 表示行首。 gross 不在任何行的开头,因此不会匹配。

标签: python regex python-2.7


【解决方案1】:
  1. 删除^$,因为它们分别用于行的开始和结束。

  2. 转义()

  3. 正确处理数字。

这是一个适合您的工作示例:

matchGrossWeight = re.search(r'gross\sweight\(KG\):[0-9]+(\.[0-9]+)?', line)

【讨论】:

    【解决方案2】:

    您的正则表达式有几个问题。看一下正则表达式语法文档:https://docs.python.org/2/library/re.html#regular-expression-syntax

    1. matchGrossWeight 的正则表达式以字符 ^ 开头,它将匹配 在字符串的开头,或在每行的开头与 re.MULTILINE .

    2. 您需要转义括号 (()) 才能将它们用作正则表达式中的文字字符。

    3. 您用小数点匹配数字的方式相当笨拙。您可以简单地使用 \. 来匹配文字 . 字符。

    【讨论】:

      【解决方案3】:

      在您的正则表达式中,将 \w* 替换为 (\d+)

      【讨论】:

      • 那不会有任何区别。 \w* 将匹配 \d+ 匹配的任何内容,因为数字 [0-9] 是“单词”字符的子类(通常为 [A-Za-z0-9_])。
      • 我正在寻找数字,而不是字母值,因此存在显着差异
      • 我知道两者是有区别的,但是解决不了OP的问题。他的正则表达式根本不匹配,而您的答案是使匹配条件更严格。这是一个合理的建议,但不会解决他眼前的问题。
      【解决方案4】:
      Total:(\d+)|gross\s*weight\(KG\):(\d+)
      

      试试这个。查看演示。

      http://regex101.com/r/hJ7nT4/5

      你的正则表达式

      matchGrossWeight = re.search(r'^gross\sweight(KG):\w*[.]?[\w]*$', line) 没有转义的 '('。 请通过\转义。

      【讨论】:

        【解决方案5】:

        如果你想捕获每个组,你也可以尝试this solution

        (?P<total>(?<=Total:)\d+(?=CASES))
        .*?
        (?P<gross_weight>(?<=gross\ weight\(KG\):)\d+(?:\.\d+)?)
        .*?
        (?P<net_weight>(?<=net\ weight\(KG\):)\d+(?:\.\d+)?)
        .*?
        (?P<volume>(?<=volume\(CBM\):)\d+(?:\.\d+)?)
        

        这会给你类似的结果:

        MATCH 1 total [6-7] `4` gross_weight [35-37] `76` net_weight [62-64] `60` volume [86-90] `0.99` MATCH 2 total [97-100] `203` gross_weight [126-134] `16695.88` net_weight [153-161] `15329.37` volume [177-182] `99.29` MATCH 3 total [189-192] `198` gross_weight [218-226] `14892.25` net_weight [245-253] `13347.77` volume [269-275] `105.14` MATCH 4 total [282-285] `231` gross_weight [311-319] `18730.56` net_weight [338-346] `16825.96` volume [362-368] `112.77`

        import re
        p = re.compile(ur'(?P<total>(?<=Total:)\d+(?=CASES)).*?(?P<gross_weight>(?<=gross\ weight\(KG\):)\d+(?:\.\d+)?).*?(?P<net_weight>(?<=net\ weight\(KG\):)\d+(?:\.\d+)?).*?(?P<volume>(?<=volume\(CBM\):)\d+(?:\.\d+)?)', re.MULTILINE | re.VERBOSE)
        test_str = u"Total:4CASES      gross weight(KG):76          net weight(KG):60          volume(CBM):0.99\nTotal:203CASES    gross weight(KG):16695.88    net weight(KG):15329.37    volume(CBM):99.29\nTotal:198CASES    gross weight(KG):14892.25    net weight(KG):13347.77    volume(CBM):105.14\nTotal:231CASES    gross weight(KG):18730.56    net weight(KG):16825.96    volume(CBM):112.77\n"
        re.findall(p, test_str)
        

        【讨论】:

          【解决方案6】:

          这是获取与毛重相关的值的一种方法:

          >>> regex = re.compile("gross weight\(KG\)\:(\d+\.*\d+)",re.MULTILINE)
          

          上面的代码放在下面的输入字符串上:

          gross weight(KG):76
          gross weight(KG):16695.88
          

          给予:

          >>> regex = re.compile("gross weight\(KG\)\:(\d+\.*\d+)",re.MULTILINE)
          >>> regex.findall(string)
          [u'76', u'16695.88']
          

          如果您一次解析一行数据,则不需要re.MULTILINE 参数。

          【讨论】:

            【解决方案7】:
            gross\s+weight\(KG\):(\d+(?:\.\d+)?)
            

            这个正则表达式也将匹配十进制数字。 您的正则表达式的问题是 ^ 匹配行开头。另外,parantheses 有特殊的含义,所以必须转义。

            演示http://regex101.com/r/jR9zX9/1

            在 Python 中,您可以将以下语法用于您的正则表达式:

            re.search(r'gross\sweight\(KG\):([0-9]+(?:\.[0-9]+)?)', line).group(1)
            

            group(1) 将只返回数字。

            【讨论】:

              猜你喜欢
              • 2016-10-10
              • 1970-01-01
              • 1970-01-01
              • 2021-06-03
              • 1970-01-01
              • 1970-01-01
              • 2013-05-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多