Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何解析*.cat文件_Python_Regex_Parsing - Fatal编程技术网

Python 如何解析*.cat文件

Python 如何解析*.cat文件,python,regex,parsing,Python,Regex,Parsing,我想解析这个文件。这是一个示例片段 '13138' => { 'REFERENCE' => '13138', 'NAME' => 'DRAPER Five 125mm Medium Grade Aluminium Oxide Sanding Discs', 'PRICE' => 108, 'MIN_QUANTITY_ORDERABLE' => 1, 'MAX_QUANTITY_ORDERABLE' => 0, 'OUT_OF_STOCK' =>

我想解析这个文件。这是一个示例片段

    '13138' => { 'REFERENCE' => '13138', 'NAME' => 'DRAPER Five 125mm Medium Grade Aluminium Oxide Sanding Discs', 'PRICE' => 108, 'MIN_QUANTITY_ORDERABLE' => 1, 'MAX_QUANTITY_ORDERABLE' => 0, 'OUT_OF_STOCK' => 0, 'DATE_PROMPT' => '', 'OTHER_INFO_PROMPT' => '', 'PRICING_MODEL' => 0, 'TAX_1' => '101=2000.00=0=', 'OPAQUE_SHIPPING_DATA' => '0.054', 'ALT_WEIGHT' => '', 'SHIP_SEPARATELY' => 0, 'SHIP_CATEGORY' => '', 'SHIP_SUPPLEMENT' => 0, 'SHIP_SUPPLEMENT_ONCE' => 0, 'HAND_SUPPLEMENT' => 0, 'HAND_SUPPLEMENT_ONCE' => 0, 'SHIP_QUANTITY' => 1, 'COST_PRICE' => 0, 'EXCLUDE_FROM_SHIP' => 0, 'ASSEMBLY_PRODUCT' => 0, 'STOCK_AISLE' => '', 'STOCK_RACK' => '', 'STOCK_SUB_RACK' => '', 'STOCK_BIN' => '', 'BARCODE' => '', 'REPORT_DESC' => '', 'PRICES' => {
    1 => [
        [0,108],
    ],
},
    'CUSTOMVARS' => 
        {
        },
'NO_ORDERLINE' => 0, 'AUTOSHIP' => 0, 'PRODUCT_GROUP' => -1, 'THUMBNAIL' => '', 'IMAGE' => '13138_694.jpg', 'ALSOBOUGHT' => [], 'RELATED' => [],  }, 
    '13139' => { 'REFERENCE' => '13139', 'NAME' => 'DRAPER Five 125mm Coarse Grade Aluminium Oxide Sanding Discs', 'PRICE' => 96, 'MIN_QUANTITY_ORDERABLE' => 1, 'MAX_QUANTITY_ORDERABLE' => 0, 'OUT_OF_STOCK' => 0, 'DATE_PROMPT' => '', 'OTHER_INFO_PROMPT' => '', 'PRICING_MODEL' => 0, 'TAX_1' => '101=2000.00=0=', 'OPAQUE_SHIPPING_DATA' => '0.066', 'ALT_WEIGHT' => '', 'SHIP_SEPARATELY' => 0, 'SHIP_CATEGORY' => '', 'SHIP_SUPPLEMENT' => 0, 'SHIP_SUPPLEMENT_ONCE' => 0, 'HAND_SUPPLEMENT' => 0, 'HAND_SUPPLEMENT_ONCE' => 0, 'SHIP_QUANTITY' => 1, 'COST_PRICE' => 0, 'EXCLUDE_FROM_SHIP' => 0, 'ASSEMBLY_PRODUCT' => 0, 'STOCK_AISLE' => '', 'STOCK_RACK' => '', 'STOCK_SUB_RACK' => '', 'STOCK_BIN' => '', 'BARCODE' => '', 'REPORT_DESC' => '', 'PRICES' => {
    1 => [
        [0,96],
    ],
},
    'CUSTOMVARS' => 
        {
        },
'NO_ORDERLINE' => 0, 'AUTOSHIP' => 0, 'PRODUCT_GROUP' => -1, 'THUMBNAIL' => '', 'IMAGE' => '13139_694.jpg', 'ALSOBOUGHT' => [], 'RELATED' => [],  }, 
    '13140' => { 'REFERENCE' => '13140', 'NAME' => 'DRAPER Five Extra Coarse Grade Aluminium Oxide Sanding Discs', 'PRICE' => 96, 'MIN_QUANTITY_ORDERABLE' => 1, 'MAX_QUANTITY_ORDERABLE' => 0, 'OUT_OF_STOCK' => 0, 'DATE_PROMPT' => '', 'OTHER_INFO_PROMPT' => '', 'PRICING_MODEL' => 0, 'TAX_1' => '101=2000.00=0=', 'OPAQUE_SHIPPING_DATA' => '0.055', 'ALT_WEIGHT' => '', 'SHIP_SEPARATELY' => 0, 'SHIP_CATEGORY' => '', 'SHIP_SUPPLEMENT' => 0, 'SHIP_SUPPLEMENT_ONCE' => 0, 'HAND_SUPPLEMENT' => 0, 'HAND_SUPPLEMENT_ONCE' => 0, 'SHIP_QUANTITY' => 1, 'COST_PRICE' => 0, 'EXCLUDE_FROM_SHIP' => 0, 'ASSEMBLY_PRODUCT' => 0, 'STOCK_AISLE' => '', 'STOCK_RACK' => '', 'STOCK_SUB_RACK' => '', 'STOCK_BIN' => '', 'BARCODE' => '', 'REPORT_DESC' => '', 'PRICES' => {
    1 => [
        [0,96],
    ],
},
    'CUSTOMVARS' => 
        {
        },
'NO_ORDERLINE' => 0, 'AUTOSHIP' => 0, 'PRODUCT_GROUP' => -1, 'THUMBNAIL' => '', 'IMAGE' => '13140_694ii.jpg', 'ALSOBOUGHT' => [], 'RELATED' => [],  }, 
这里它包含3个项目。它们以类似于
'13138'=>{'REFERENCE'
的字符串开始,并在相同类型的字符串之前结束。如何拆分这些部分


我尝试了
re.search(r“{'REFERENCE.*?(?={'REFERENCE')”,catstr)
。但是它不匹配。

为什么不用
替换
=>

    'CUSTOMVARS' :
        {
        },
'NO_ORDERLINE' : 0, 'AUTOSHIP' : 0, 'PRODUCT_GROUP' : -1, ...
并使用进行评估。它只评估文本,不评估可执行代码,因此无需进行清理(可能会防止输入过大):

安全地计算表达式节点或包含Python表达式的字符串。 提供的字符串或节点只能由 以下Python文本结构:字符串、数字、元组、列表、, 口授、布尔语和无语

这可以用于安全地计算包含来自的Python表达式的字符串 不受信任的源,无需解析 重视自己

编辑:工作示例

#!/usr/bin/env python2
# -*- encoding: utf8 -*-

import urllib2
import ast
import re
from pprint import PrettyPrinter

pp = PrettyPrinter()
resp = urllib2.urlopen("http://pastie.org/pastes/7461356/download")
content = resp.read()
content = re.search(r"\s+=\s+({(?:.|\n)+});", content).group(1)
# Fix following line to handle => inside strings, if needed
content = re.sub(r"=>", r":", content) 
parsed = ast.literal_eval(content)
pp.pprint(parsed)
有关仅替换字符串外部的信息,请参阅 这个答案是:

编辑

给定的文件包含除散列本身之外的其他标记
re.search
在上面去除多余的代币:

\s+=\s+      # This marks the = before the start of the hash
({           # Capture the first {
  (?:.|\n)+  # This matches all characters.
             # The (?: is to prevent capture-inside-capture
})           # Capture the last }
;            # This is not captured

你为什么不把
=>
换成

    'CUSTOMVARS' :
        {
        },
'NO_ORDERLINE' : 0, 'AUTOSHIP' : 0, 'PRODUCT_GROUP' : -1, ...
并使用进行评估。它只评估文本,不评估可执行代码,因此无需进行清理(可能会防止输入过大):

安全地计算表达式节点或包含Python表达式的字符串。 提供的字符串或节点只能由 以下Python文本结构:字符串、数字、元组、列表、, 口授、布尔语和无语

这可以用于安全地计算包含来自的Python表达式的字符串 不受信任的源,无需解析 重视自己

编辑:工作示例

#!/usr/bin/env python2
# -*- encoding: utf8 -*-

import urllib2
import ast
import re
from pprint import PrettyPrinter

pp = PrettyPrinter()
resp = urllib2.urlopen("http://pastie.org/pastes/7461356/download")
content = resp.read()
content = re.search(r"\s+=\s+({(?:.|\n)+});", content).group(1)
# Fix following line to handle => inside strings, if needed
content = re.sub(r"=>", r":", content) 
parsed = ast.literal_eval(content)
pp.pprint(parsed)
有关仅替换字符串外部的信息,请参阅 这个答案是:

编辑

给定的文件包含除散列本身之外的其他标记
re.search
在上面去除多余的代币:

\s+=\s+      # This marks the = before the start of the hash
({           # Capture the first {
  (?:.|\n)+  # This matches all characters.
             # The (?: is to prevent capture-inside-capture
})           # Capture the last }
;            # This is not captured

这些是ruby哈希吗?@limelights不确定。它可以在由
Actinic
创建的网站上找到。它们声明
。此外,您可能希望更正
[this][1]
标记以指向实际文件。如果您不确定标记,可以使用“链接”编辑器顶部的按钮。这些是ruby哈希吗?@limelights不确定。它可以在由
Actinic
创建的网站上找到。它们声明
。此外,您可能希望更正
[this][1]
标记以指向实际文件。如果您不确定标记,可以使用“链接”编辑器顶部的按钮。在这样的情况下,我甚至不会提到
eval
;)@mata感谢大家的提醒,
literal\u eval
在这种情况下显然是优越的。删除了
eval
。唯一需要担心的是某个名称字符串中是否存在
,这会导致除非非常小心,否则此方法将无法正确更改。我复制粘贴了内容并尝试了它。但不起作用。但当我使用urllib2下载并使用原始内容时,它确实起作用。感谢ab工作示例在这种情况下,我甚至不会提及
eval
;)@mata感谢提醒,
literal\u eval
I在这种情况下,它显然更优越。删除了对
eval
的提及。唯一需要担心的是某个名称字符串中是否存在
=>
,除非非常小心,否则此方法会错误地更改。我复制粘贴了内容并尝试了它。但没有起作用。但是当我下载并使用使用urllib2 sed原始内容确实有效。感谢ab工作示例