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

时间:2019-01-22 04:57:07

标签: python regex python-3.x

说我有一个字符串:

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]

但是我不知道如何循环运行这段代码以提取名称

谢谢

2 个答案:

答案 0 :(得分:0)

我使用regexr.com并使用正则表达式,直到找到正确的表达式,然后将其隐藏到Python中。

https://regexr.com/

我假设\ 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']

模式说明:

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

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

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