解读一段正则表达式的代码内容

input:为html源码片段,其中有以下内容:

<PARAM name=FileInfos value="<!1!>8BDE3F3E6575393C4825852900265C9D<file_action>newonefile</file_action><file_unid>132284704358814000NQ</file_unid><UpdateInfo>张三于2020-03-12 15:01:57创建.;李四于2020-03-12 15:31:58重命名.;张三于2020-03-12 15:32:23重命名.</UpdateInfo><file_name>3-附件3:评价参考要素.xlsx</file_name><file_size>34225</file_size><file_create>2020-03-12 15:01:57</file_create><file_update>2020-03-12 15:07:15</file_update><file_editmodel>0</file_editmodel><file_lockuser>0</file_lockuser><CreateInfo>唐森 2020-03-12 15:07:15</CreateInfo><CusAttributes></CusAttributes><filetype>default</filetype><user_name>唐森</user_name><localfile_create>2020-3-03 10:24:46</localfile_create><localfile_update>2020-3-04 10:35:53</localfile_update><CatNum>0</CatNum><Ext></Ext><IsGaizhang>False</IsGaizhang><TaodaInfo></TaodaInfo><doc_unid>4825795A000CAA90482585290034FB41</doc_unid></!1!><!2!>8BDE3F3E6575393C4825852900265C9D<file_action>newonefile</file_action><file_unid>132284704357804000N5</file_unid><UpdateInfo>唐森于2020-03-12 15:01:57创建.;战三于2020-03-12 15:31:48重命名.;白于2020-03-12 15:32:17重命名.</UpdateInfo><file_name>2-附件1、2:画像评价情况.xlsx</file_name><file_size>22007</file_size><file_create>2020-03-12 15:01:57</file_create><file_update>2020-03-12 15:07:15</file_update><file_editmodel>0</file_editmodel><file_lockuser>0</file_lockuser><CreateInfo>唐森 2020-03-12 15:07:15</CreateInfo><CusAttributes></CusAttributes><filetype>default</filetype><user_name>唐森</user_name><localfile_create>2020-3-03 10:24:46</localfile_create><localfile_update>2020-3-04 12:10:19</localfile_update><CatNum>0</CatNum><Ext></Ext><IsGaizhang>False</IsGaizhang><TaodaInfo></TaodaInfo><doc_unid>4825795A000CAA90482585290034FB44</doc_unid></!2!><!3!>8BDE3F3E6575393C4825852900265C9D<file_action>newonefile</file_action><file_unid>132284791227031961NG</file_unid><UpdateInfo>白于2020-03-12 17:27:19创建.</UpdateInfo><file_name>1-工单〔2020〕4号.gw</file_name><file_size>27775</file_size><file_create>2020-03-12 17:27:19</file_create><file_update>2020-03-12 17:32:02</file_update><file_editmodel>0</file_editmodel><file_lockuser>0</file_lockuser><CreateInfo>白云 2020-03-12 17:32:02</CreateInfo><CusAttributes></CusAttributes><filetype>default</filetype><user_name>白云</user_name><localfile_create>2020-3-12 17:32:02</localfile_create><localfile_update>2020-3-12 17:32:02</localfile_update><CatNum>0</CatNum><Ext></Ext><IsGaizhang>False</IsGaizhang><TaodaInfo></TaodaInfo><doc_unid>4825795A000CAA90482585290034FB4A</doc_unid></!3!><!4!>2CEB197C9E8F0CB24825852900362984<file_unid>132284790629461079N8</file_unid><file_name>1-工单发〔2020〕4号.sep</file_name><file_size>20035</file_size><file_create>2020-3-12 17:26:19</file_create><file_update>2020-3-12 17:31:2</file_update><file_editmodel>0</file_editmodel><doc_unid>4825795A000CAA904825852A0033CF6A</doc_unid></!4!><!5!>2CD89E0B21B58D224825852D000A1289<file_unid>132284790391160818N6</file_unid><file_name>1-工监发〔2020〕4号.docx</file_name><file_size>39753</file_size><file_create>2020-3-12 17:30:39</file_create><file_update>2020-3-12 17:30:39</file_update><file_editmodel>0</file_editmodel><doc_unid>FDC0E608B54C8F024825852D000F35E3</doc_unid></!5!>">

的片段,以下代码可以把他变成
[{},{},{},{},{}]的形式,

def funtion(html):
    regex = r"<(!\d+!)>([\s\S]*?)</\1>"
    regex2 = r"<(\w+)>([\s\S]*?)</\1>"
    file_list = re.finditer(regex, html)
    result = []
    for m in file_list:
        content = m.group(2)
        if content is not None:
            items = re.finditer(regex2, content)
            line = {}
            for item in items:
                if item is not None:
                    line[item.group(1)] = item.group(2)
            result.append(line)
    return result

但我并不是很清楚这代码是怎么运行的,我现在需要的是一个数组
[{‘file_name’:file_name,’file_url’:url},{},{}]字典里
url的模版是这样的:

http://server.com/<doc_unid>/$file/<file_unid><file_name>(扩展名部分)

也就是需要、、这三个value,请问该如何修改此方法,或者有更简单易懂的方法?
中需要得到每个元素的

又搞复杂了,用bs4

soup = BeautifulSoup(html, 'lxml',exclude_encodings='utf-8')
data = soup.find('param', attrs={'name': 'FileInfos'})['value']
soup_data = BeautifulSoup(data, 'lxml', exclude_encodings='utf-8')
for n in soup_data.children:
        print(n.doc_unid.string)

可为什么返回第一个数据

最佳答案

项目具体的场景是取来一个片段
具体标签结构为

<span>
   <object>
     <param name=sdsfas value='ddd' >
     <PARAM name=FileInfos value=''<!1!>8BDE3F3E6575393C4825852900265C9....
    <param name=dsdsda value='ss' >
   /*很多个不同name的<param>标签
 </object>
</span>

而需求就是把这个FileInfos中的value取出来然后结构化,最后我还是利用了bs4来操作。

from bs4 import BeautifulSoup
            #最让人头疼的地方是<!1!></!1!>这个特殊的标签,会影响解析
s=BeautifulSoup(html_span, 'lxml')   #解析为xml
d = soup.find('param', attrs={'name': 'FileInfos'})['value']  #提取FileInfos的value值
data='<ul>' + re.sub(r'(\<)(/?)\!(\d+\!)', r'<\g<2>li', d) + '</ul>'   #用正则表达式将<!数字!>和</!数字!>替换成<li></li>,并在前后加上一个标签闭合
soup_data = BeautifulSoup(data, 'lxml')#解析后可以用n.file_name进行提取操作
    for n in soup_data.find_all('li'):
        print(n.file_name.string)

可能有些复杂,希望大家可交流简便的方法

4年前 评论
讨论数量: 2
Jason990420

是这样么....

import re

request = 'http://server.com/<doc_unid>/$file/<file_unid><file_name>(扩展名部分)'
regex = 'http://server.com/<(\d+)>/\$file/<(\d+)><([a-zA-Z0-9]+)>\([a-zA-Z0-9]+\)'

# Create data html for parsing
form = 'http://server.com/<{}>/$file/<{}><{}>({})http://server.com/'
a0 = ['12', '1 2']
b0 = ['34', '3 4']
c0 = ['test', 'te st']
d0 = ['pdf', 'pd f']
html = ''
for a in a0:
    for b in b0:
        for c in c0:
            for d in d0:
                html += form.format(a, b, c, d)

file_list = re.finditer(regex, html)

result = []
for file in file_list:
    result.append((file.group(1), file.group(2), file.group(3)))

print(result)

[('12', '34', 'test')]
4年前 评论
joeyun (楼主) 4年前

项目具体的场景是取来一个片段
具体标签结构为

<span>
   <object>
     <param name=sdsfas value='ddd' >
     <PARAM name=FileInfos value=''<!1!>8BDE3F3E6575393C4825852900265C9....
    <param name=dsdsda value='ss' >
   /*很多个不同name的<param>标签
 </object>
</span>

而需求就是把这个FileInfos中的value取出来然后结构化,最后我还是利用了bs4来操作。

from bs4 import BeautifulSoup
            #最让人头疼的地方是<!1!></!1!>这个特殊的标签,会影响解析
s=BeautifulSoup(html_span, 'lxml')   #解析为xml
d = soup.find('param', attrs={'name': 'FileInfos'})['value']  #提取FileInfos的value值
data='<ul>' + re.sub(r'(\<)(/?)\!(\d+\!)', r'<\g<2>li', d) + '</ul>'   #用正则表达式将<!数字!>和</!数字!>替换成<li></li>,并在前后加上一个标签闭合
soup_data = BeautifulSoup(data, 'lxml')#解析后可以用n.file_name进行提取操作
    for n in soup_data.find_all('li'):
        print(n.file_name.string)

可能有些复杂,希望大家可交流简便的方法

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!