如何在Python中使用正则表达式返回这些数字?

如何在Python中使用正则表达式返回这些数字?,python,regex,findall,Python,Regex,Findall,我将以下代码存储为Python中的字符串变量。如何使用正则表达式以及re.findall(“”,text),解析出下面代码中“attributeLookup”查找下的五个9位数字(均以“305…”开头) var PRO_META_JSON = { "attributeDefinition":{ "defaultSku":305557121, "attributeListing":[{ "label":"Finish",

我将以下代码存储为Python中的字符串变量。如何使用正则表达式以及
re.findall(“”,text)
,解析出下面代码中“attributeLookup”查找下的五个9位数字(均以“305…”开头)

var PRO_META_JSON = {
    "attributeDefinition":{
        "defaultSku":305557121,
        "attributeListing":[{ 
            "label":"Finish",
                    "defaultIndex":0,
                    "options":[
                        "White::f33b4086",
                        "Beige::8e0900fa",
                        "Blue::3c3a4707",
                        "Orange::1d8cb503",
                        "Spring Green::dd5e599a"
                     ]
            }],
            "attributeLookup":[
            [0,305557121],
            [1,305557187],
            [2,305557696],
            [3,305557344],
            [4,305696435]
            ]
        }
    };

在findall中,您希望选择9个字符中的0到9位,如下所示。使用json模块比将其存储为字符串更好

我非常有用的python正则表达式测试程序可以在这里找到


这里有一个方法。首先解析字符串以获取json对象(最外层大括号内的所有内容)。然后使用json模块解码json对象并访问所需内容

astr = '''var PRO_META_JSON = {
    "attributeDefinition":{
        "defaultSku":305557121,
        "attributeListing":[{ 
            "label":"Finish",
                    "defaultIndex":0,
                    "options":[
                        "White::f33b4086",
                        "Beige::8e0900fa",
                        "Blue::3c3a4707",
                        "Orange::1d8cb503",
                        "Spring Green::dd5e599a"
                     ]
            }],
            "attributeLookup":[
            [0,305557121],
            [1,305557187],
            [2,305557696],
            [3,305557344],
            [4,305696435]
            ]
        }
    };'''

import re
import json
pat = re.compile('^[^\{]*(\{.*\});.*$', re.MULTILINE|re.DOTALL)
json_str = pat.match(astr).group(1)
d = json.loads(json_str)

for x in d['attributeDefinition']['attributeLookup']:
    print x[1]
# 305557121
# 305557187
# 305557696
# 305557344
# 305696435

您可以使用内置库来解析它。我假设您已经摆脱了Javascript:

import json

input = """{
"attributeDefinition":{
    "defaultSku":305557121,
    "attributeListing":[{ 
        "label":"Finish",
                "defaultIndex":0,
                "options":[
                    "White::f33b4086",
                    "Beige::8e0900fa",
                    "Blue::3c3a4707",
                    "Orange::1d8cb503",
                    "Spring Green::dd5e599a"
                 ]
        }],
        "attributeLookup":[
        [0,305557121],
        [1,305557187],
        [2,305557696],
        [3,305557344],
        [4,305696435]
        ]
    }
}"""

data = json.loads(input)

# Get a list you can do stuff with. This gives you:
# [[0, 305557121], [1, 305557187], [2, 305557696], [3, 305557344], [4, 305696435]]
els = data['attributeDefinition']['attributeLookup']

for el in els:
    # Each el looks like: [0, 305557121]
    print(el[1])

不知道为什么要使用正则表达式。你也开车去拜访你的邻居吗?

这看起来像
Java
code,而不是
Python
。你是从档案里读到的吗?您可以使用
Python
中的
JSON
库,然后深入到该键/值并使用本机
Python
进行搜索,而不需要任何正则表达式。我认为您应该改用正则表达式。它不是Java或Python。这是Javascript,显然是在Python字符串中。这是唯一的代码还是只是示例?这看起来像“attributeLookup”下的Javascript
。当我尝试运行
data=json时,不要在这里使用正则表达式。加载(输入)
,我会得到一个
类型错误:预期的字符串或缓冲区
错误。我的变量在开始时仍然有
var PRO_META_JSON=
,所以我猜这就是原因。当我试图操作字符串并删除第一个“x”字符时,我得到一个
TypeError:unhabable type
错误。知道我做错了什么吗?谢谢你的帮助!嗯。在尝试使用json之前,只需将输入内容打印出来即可。加载
,以便查看。您可能会在那里发现一些东西(例如,在您的数据中,有一个尾随分号需要删除),谢谢。我尝试使用
input[-1::]
删除尾随的分号,但它给出了
TypeError:unhabable type
错误。我怎样才能从数据中删除分号?@user994585很抱歉坚持,但你没有看到我的答案吗?我想这正是你想要的do@user994585您正在寻找
input[:-1]
来完成这一操作,或者您可以使用Julien的代码一次完成所有操作。谢谢您的帮助。当我使用它时,
json_str
行给我一个
TypeError:expected string或buffer
错误。我相信这是因为
astr
实际上是一个BeautifulSoup对象,而不是字符串。但是,当我使用
astr\u string=str(astr)
将其转换为字符串时,我在
json\u str
行上得到此错误:
AttributeError:'NoneType'对象没有属性“group”
。有什么建议吗?第二个错误是因为正则表达式与字符串不匹配。我编写的代码片段可以与您提供的字符串一起工作,但是如果字符串稍有不同(比如末尾有一个额外的空格或行),它将找不到匹配项。。。正则表达式可能需要调整为精确的字符串(我看不到)。我在正则表达式中做了一个小的编辑,应该会更宽容一些,但是没有看到您的确切字符串,调试起来很困难。
import json

input = """{
"attributeDefinition":{
    "defaultSku":305557121,
    "attributeListing":[{ 
        "label":"Finish",
                "defaultIndex":0,
                "options":[
                    "White::f33b4086",
                    "Beige::8e0900fa",
                    "Blue::3c3a4707",
                    "Orange::1d8cb503",
                    "Spring Green::dd5e599a"
                 ]
        }],
        "attributeLookup":[
        [0,305557121],
        [1,305557187],
        [2,305557696],
        [3,305557344],
        [4,305696435]
        ]
    }
}"""

data = json.loads(input)

# Get a list you can do stuff with. This gives you:
# [[0, 305557121], [1, 305557187], [2, 305557696], [3, 305557344], [4, 305696435]]
els = data['attributeDefinition']['attributeLookup']

for el in els:
    # Each el looks like: [0, 305557121]
    print(el[1])
string = '''var PRO_META_JSON = {
    "attributeDefinition":{
        "defaultSku":305557121,
        "attributeListing":[{ 
            "label":"Finish",
                    "defaultIndex":0,
                    "options":[
                        "White::f33b4086",
                        "Beige::8e0900fa",
                        "Blue::3c3a4707",
                        "Orange::1d8cb503",
                        "Spring Green::dd5e599a"
                     ]
            }],
            "attributeLookup":[
            [0,305557121],
            [1,305557187],
            [2,305557696],
            [3,305557344],
            [4,305696435]
            ]
        }
    };'''

import json
data = json.loads(string.split('=', 1)[1].strip(';'))
for d in data['attributeDefinition']['attributeLookup']:
    print(d[1])