我有一个包含许多行的文本文件,例如:
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?
感谢您的支持。
答案 0 :(得分:1)
删除^
和$
,因为它们分别适用于行开始和结束。
逃离(
和)
以正确的方式处理这些数字。
以下是您的工作示例:
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
matchGrossWeight
的正则表达式以字符^
开头,该字符将匹配字符串开头的 或每行的开头re.MULTILINE
。
您需要转义括号(()
)以将它们用作正则表达式中的文字字符。
您的数字与小数点匹配的方式相当尴尬。您只需使用\.
即可匹配文字.
字符。
答案 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)