Python:使用正则表达式没有结果

时间:2014-09-16 16:49:30

标签: python regex python-2.7

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

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?

感谢您的支持。

7 个答案:

答案 0 :(得分:1)

  1. 删除^$,因为它们分别适用于行开始和结束。

  2. 逃离()

  3. 以正确的方式处理这些数字。

  4. 以下是您的工作示例:

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

答案 1 :(得分:0)

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

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

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

  3. 您的数字与小数点匹配的方式相当尴尬。您只需使用\.即可匹配文字.字符。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

Total:(\d+)|gross\s*weight\(KG\):(\d+)

试试这个。参见演示。

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

你的正则表达式

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

答案 4 :(得分:0)

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)将仅返回该号码。

答案 5 :(得分:0)

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

>>> 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参数。

答案 6 :(得分:0)

如果您想捕获每个组,也可以尝试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)