用python和regEx从文件中提取元组

2024-09-30 06:19:38 发布

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


我有一个包含各种数据的html格式文件,我需要从中提取某些对(id,title)。为此,我编写了一个在regEx online tester中运行良好的regEx。
我需要从中提取数据的文件:

<g id="node841" class="cond_node"><title>SR_AUD_Nbest_List_PlaylistPlayPlaylist_cond</title>
<g id="node842" class="prompt_node"><title>SR_AUD_Nbest_List_PlaylistPlayPlaylist_prompt</title>
<g id="edge841" class="edge"><title>SR_AUD_Nbest_List_PlaylistPlayPlaylist_cond&#45;&gt;SR_AUD_Nbest_List_PlaylistPlayPlaylist_prompt</title>
<g id="node848" class="node"><title>SR_AUD_Main_link_51</title>
<g id="node841" class="prompt_node"><title>SR_AUD_Nbest_List_PlaylistPlayPlaylist_prompt</title>
<g id="node841" class="cmd_node"><title>SR_AUD_Nbest_List_PlaylistPlayPlaylist_cmd</title>
<g id="node856" class="exit_node"><title>EXIT_63</title>
<g id="node860" class="node"><title>SR_AUD_ConfirmNAPlayPlaylistName_NotAvailable_3</title>
<g id="node860" class="node"><title>SR_AUD_ConfirmNAPlayPlaylistName_NotAvailable_4</title><title>SR_AUD_ConfirmNAPlayPlaylistName_NotAvailable_3</title>

使用此正则表达式:

^{pr2}$

我正在提取符合上述条件的整条直线。
使用该文件和正则表达式提取这些特定行的python脚本:

result = re.search(r'(id="\w+"\s+class="node">+.{1,})(?!.+(_cmd|_cond|_prompt|EXIT))', svg)

但问题是,结果只包含1对数据(仅用于节点id 848),用“space char”分隔,而不是用正则表达式提取的整个行列表。在

您知道如何从整个文件中提取与该正则表达式匹配的所有数据,而不仅仅是一行吗?在这种特殊情况下,提取的数据应该是,正如在线regex测试人员所说:

<g id="node848" class="node"><title>SR_AUD_Main_link_51</title>
<g id="node860" class="node"><title>SR_AUD_ConfirmNAPlayPlaylistName_NotAvailable_3</title>
<g id="node860" class="node"><title>SR_AUD_ConfirmNAPlayPlaylistName_NotAvailable_4</title>

Tags: 数据idnodetitlepromptlistclasssr
2条回答

正如注释中提到的,正则表达式可能不是解析XML的最佳工具。在

尽管如此,您的方法的唯一问题似乎是使用^{}而不是^{}或{a3},因此只返回第一个匹配项,而不是全部。在

p = r'(<g\sid="\w+"\s+class="node">+.{1,})(?!.+(_cmd|_cond|_prompt|EXIT))'
for match in re.finditer(p, svg):
    print match.group()

但是,请注意,在最后一个例子中,它将捕获整个行,而不仅仅是第一个<title>。在

from bs4 import BeautifulSoup

html="""<g id="node841" class="cond_node"><title>SR_AUD_Nbest_List_PlaylistPlayPlaylist_cond</title>
<g id="node842" class="prompt_node"><title>SR_AUD_Nbest_List_PlaylistPlayPlaylist_prompt</title>
<g id="edge841" class="edge"><title>SR_AUD_Nbest_List_PlaylistPlayPlaylist_cond&#45;&gt;SR_AUD_Nbest_List_PlaylistPlayPlaylist_prompt</title>
<g id="node848" class="node"><title>SR_AUD_Main_link_51</title>
<g id="node841" class="prompt_node"><title>SR_AUD_Nbest_List_PlaylistPlayPlaylist_prompt</title>
<g id="node841" class="cmd_node"><title>SR_AUD_Nbest_List_PlaylistPlayPlaylist_cmd</title>
<g id="node856" class="exit_node"><title>EXIT_63</title>
<g id="node860" class="node"><title>SR_AUD_ConfirmNAPlayPlaylistName_NotAvailable_3</title>
<g id="node860" class="node"><title>SR_AUD_ConfirmNAPlayPlaylistName_NotAvailable_4</title><title>SR_AUD_ConfirmNAPlayPlaylistName_NotAvailable_3</title>"""


soup = BeautifulSoup(html)

a=soup.findAll("g")

b=[(i.get('id'),i.title.text) for i in a]

print b

输出:

^{pr2}$

1.找到所有标签

soup.findAll("g") 

2.您可以通过将标记视为字典来访问标记的属性。在

^{4}$

给您所需的id,title.text给您文本。在

相关问题 更多 >

    热门问题