说我有一个字符串:
output='[{ "id":"b678792277461" ,"Responses":{"SUCCESS":{"sh xyz":"sh xyz\\n Name Age Height Weight\\n Ana \\u003c15 \\u003e 163 47\\n 43\\n DEB \\u003c23 \\u003e 155 \\n Grey \\u003c53 \\u003e 143 54\\n 63\\n Sch#"},"FAILURE":{},"BLACKLISTED":{}}}]'
这只是一个例子,但是我有更长的输出,它是来自api调用的响应。
我想提取所有名称(ana, dab, grey
)并放在一个单独的列表中。
我该怎么办?
json_data = json.loads(output)
json_data = [{'id': 'b678792277461', 'Responses': {'SUCCESS': {'sh xyz': 'sh xyz\n Name Age Height Weight\n Ana <15 > 163 47\n 43\n DEB <23 > 155 \n Grey <53 > 143 54\n 63\n Sch#'}, 'FAILURE': {}, 'BLACKLISTED': {}}}]
1)我尝试过re.findall('\\n(.+)\\u',output)
但这没用,因为它说“序列不完整”
2)
start = output.find('\\n')
end = output.find('\\u', start)
x=output[start:end]
但是我不知道如何循环运行这段代码以提取名称
谢谢
答案 0 :(得分:0)
我使用regexr.com并使用正则表达式,直到找到正确的表达式,然后将其隐藏到Python中。
我假设\ n是换行符,我敢打赌您的\ u错误是由换行引起的。要在Python中使用多行匹配,您需要在编译时使用该标志。
\ n(。*)\ n-这会很贪心,并尽可能多地匹配(在示例中,它将通过54 \ n捕获整个\ nAna
[{“ id”:“ 678792277461”,“响应”:{姓名年龄身高体重\ n Ana \ u00315 \ u003163 47 \ n 43 \ n Deb \ u00323 \ u003155 60 \ n灰色\ u00353 \ u003144 54 \ n}]
import re
a = re.compile("\\n(.*)\\n", re.MULTILINE)
for responses in a.match(source):
match = responses.split("\n")
# match[0] should be " Ana \u00315 \u003163 47"
# match[1] should be " Deb \u00323 \u003155 60" etc.
答案 1 :(得分:0)
\u
对象不是字母,因此无法匹配。它是Unicode序列的一部分。以下正则表达式可以工作,但是有点古怪。它会寻找每行的开头(第一行除外),直到第一行为止。
output = json_data[0]['Responses']['SUCCESS']['sh xyz']
pattern = "\n\s*([a-z]+)\s+"
result = re.findall(pattern, output, re.M | re.I)
#['Name', 'Ana', 'DEB', 'Grey']
模式说明:
不幸的是,"Name"
也被识别为名称。如果您知道它始终出现在第一行中,请对结果列表进行切片:
result[1:]
#['Ana', 'DEB', 'Grey']