如何在Python中使用正则表达式返回这些数字?
我将以下代码存储为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",
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])