我一直在挑选我的大脑如何从以下字符串中获取2个整数:
:{\"page_type\":16,\"actor_id\":100010050258799,\"story_id\":166366493708358,\"a
我可以写正则表达式,但它逃避它会导致一些令人头疼的问题。
我需要使用哪些字符才能使其与re.match
例如,如何将"
放在以下位置:
re.match("actor_id\\")
我试过\\\\""
无效。
它是一个JSON字符串,但在这种情况下JSON解码不是一个选项,因为它在源代码中很深,不能通过遍历DOM轻松访问。所以我坚持使用正则表达式。
答案 0 :(得分:1)
您可以简单地将所有非数字视为相同:
re.match(r'[^\d]+\d+[^\d]+(\d+)[^\d]+(\d+)', thestring)
这匹配但不捕获第一个数字(16
),然后
抓住另外两个。插入actor_id
之类的内容非常简单
如果你需要它更具体。
答案 1 :(得分:1)
您可能需要查看re.match
的文档,因为它声明:
如果字符串开头的零个或多个字符与正则表达式匹配
注意:BEGINNING。
您可以使用`re.findall'将每个键标记为其int。 IE:
>>> s = ':{\"page_type\":16,\"actor_id\":100010050258799,\"story_id\":166366493708358,\"a'
>>> re.findall('"([^"]+)":(\d+)',s)
[('page_type', '16'), ('actor_id', '100010050258799'), ('story_id', '166366493708358')]
>>>
>>> d = dict(re.findall('"([^"]+)":(\d+)',s))
>>> d
{'actor_id': '100010050258799', 'page_type': '16', 'story_id': '166366493708358'}
注意模式:
"([^"]+)":(\d+)
" #matches `"` char
([^"]+) #matches anything EXCEPT `"` char, and captures in a group
": #matches `":` chars
(\d+) #matches 1 or more digits and captures in a group
答案 2 :(得分:0)
这个没什么特别的。
>>> import re
>>> x = ':{\"page_type\":16,\"actor_id\":100010050258799,\"story_id\":166366493708358,\"a'
>>> re.search(
'\\"page_type\\":([0-9]+),'
'\\"actor_id\\":([0-9]+)',
x
).groups()
('16', '100010050258799')
我更感兴趣的是为什么JSON解码不是你的选择?你得到一个特殊的例外还是这个psuedo-JSON格式?
答案 3 :(得分:0)
为什么不使用'
代替"
。如果使用单引号,则不必转义双引号字符。这对我有用:
s = ":{\"page_type\":16,\"actor_id\":100010050258799,\"story_id"
m = re.search('actor_id":(\\d+),',s)
print(m.group(1))