如何使用正则表达式从python中带有空格的字符串中提取子字符串?

2024-06-16 00:27:19 发布

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

我有一个长字符串,是从使用python的webscraping中获得的。我希望能够以类似{'XXXXXXXX':'AAAAAAAA','YYYYYYYY':'BBBBBBBB}的形式获得输出,并希望将所有内容都放在数据帧中

这是一个非常长的字符串示例:

\\n    display:block\\u0022\\u003E\\n                                  div class= span_6\\u0022\\u003E\\n                                     li class=\\u0022borderbottom padleft pad20 nomargin\\u0022\\u003E\\n   span\\u003E1. XXXXXXXX\\/span\\u003E\\n                                strong class=\\u0022floatright\\u0022\\u003EAAAAAAAA\\/strong\\u003E\\n       \\/li\\u003E\\n                                                        li class=\\u0022borderbottom padleft pad20 nomargin\\u0022\\u003E\\n   span\\u003E2. YYYYYYYY\\/span\\u003E\\n                                strong class=\\u0022floatright\\u0022\\u003EBBBBBBBB\\/strong\\u003E\\n

#为清晰起见,采用分块引用:

\n display:block\u0022\u003E\n
div class= span_6\u0022\u003E\n
li class=\u0022borderbottom padleft pad20 nomargin\u0022\u003E\n
span\u003E1. XXXXXXXX\/span\u003E\n
strong class=\u0022floatright\u0022\u003EAAAAAAAA\/strong\u003E\n
\/li\u003E\n
li class=\u0022borderbottom padleft pad20 nomargin\u0022\u003E\n
span\u003E2. YYYYYYYY\/span\u003E\n
strong class=\u0022floatright\u0022\u003EBBBBBBBB\/strong\u003E\n

我正在尝试这样做:

#s = the string 
pattern = "u003E\|(.*?)\|\\/strong"
substring = re.search(pattern, s).group(1) 
print(substring)

但它失败了。最好的方法是什么

编辑: 预期输出为两个列表:

list1 = ['XXXXXXXX','YYYYYYYY']
list2 = ['AAAAAAAA','BBBBBBBB']

Tags: 字符串liclassstrongspanaaaaaaaaxxxxxxxxyyyyyyyy
1条回答
网友
1楼 · 发布于 2024-06-16 00:27:19

您可以使用以下解决方案:

import re
s = '\\n    display:block\\u0022\\u003E\\n                                  div class= span_6\\u0022\\u003E\\n                                     li class=\\u0022borderbottom padleft pad20 nomargin\\u0022\\u003E\\n   span\\u003E1. XXXXXXXX\\/span\\u003E\\n                                strong class=\\u0022floatright\\u0022\\u003EAAAAAAAA\\/strong\\u003E\\n       \\/li\\u003E\\n                                                        li class=\\u0022borderbottom padleft pad20 nomargin\\u0022\\u003E\\n   span\\u003E2. YYYYYYYY\\/span\\u003E\\n                                strong class=\\u0022floatright\\u0022\\u003EBBBBBBBB\\/strong\\u003E\\n'
unescaped_s = s.encode('latin-1', 'backslashreplace').decode('unicode-escape')
pattern = r">\d+\.\s*([^<>]*)\\/span>\s*[^>]*>([^<>]*)\\/strong"
substrings = re.findall(pattern, unescaped_s)
print(dict(substrings))

online Python demo。首先,该字符串是未转换的,并且正则表达式应用于未转换的输入字符串版本

regex

>\d+\.\s*([^<>]*)\\/span>\s*[^>]*>([^<>]*)\\/strong

详细信息

  • >-a>字符
  • \d+-一个或多个数字
  • \.-一个点
  • \s*-零个或多个空格
  • ([^<>]*)-组1:除<>之外的零个或多个字符
  • \\/span>-\/span>文本
  • \s*-零个或多个空格
  • [^>]*>-除>>字符以外的任何零个或多个字符
  • ([^<>]*)-第2组:除<>之外的零个或多个字符
  • \\/strong-a\/strong>文本

相关问题 更多 >