如何从字符串的段落中提取子字符串集

2024-06-26 14:52:28 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个字符串:

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)

但这不起作用,因为上面写着“不完整的u序列”

(二)

start = output.find('\\n')
end = output.find('\\u', start)
x=output[start:end]

但我不知道如何在循环中运行这段代码来提取名称

谢谢


Tags: nameidjsonoutputageshresponsesstart
2条回答

\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']

模式说明:

  • 从新行开始(\n)
  • 跳过所有空格(如果有)(\s*)
  • 收集一个或多个字母([a-z]+)
  • 至少跳过一个空格(\s+)

不幸的是,"Name"也被识别为一个名称。如果您知道它总是出现在第一行中,请对结果列表进行切片:

result[1:]
#['Ana', 'DEB', 'Grey']

我用regexr.com然后使用正则表达式,直到我得到正确的结果,然后将其转换为Python。你知道吗

https://regexr.com/

我假设\n是换行符,我敢打赌您的错误是由换行符引起的。要在Python中使用多行匹配,需要在编译时使用该标志。你知道吗

\n(.*)\n-这将是贪婪的,并获取尽可能多的匹配项(在本例中,它将获取从\n到\n的整个匹配项)

[{“id”:“678792277461”,“Responses”:{姓名年龄身高体重\n Ana\u00315\u003163 47\n 43\n Deb\u00323\u003155 60\n Grey\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.

相关问题 更多 >