在Python中合并具有相同内容但重叠HTML标记的多个字符串

在Python中合并具有相同内容但重叠HTML标记的多个字符串,python,regex,string,nlp,Python,Regex,String,Nlp,标题本身并不是一个明确的问题,因此我将提供一个示例: 我有一个字符串示例: 为客户端创建和管理网站,以安全地进行通信 它有很多“版本”。这意味着字符串“版本”中的一个单词或短语将包含在HTML div标记中,即foo bar。(这些标记是任意的,字体大小属性的数字对应于分数,这些分数稍后将用作其他CSS功能,而这些功能现在是不相关的。)以下是字符串的4个版本: 为客户端创建和管理网站,以安全地进行通信 为客户创建和管理网站,以便进行安全通信 为客户创建和管理网站,以便进行安全通信 为客户创建和

标题本身并不是一个明确的问题,因此我将提供一个示例:

我有一个字符串示例:

为客户端创建和管理网站,以安全地进行通信
它有很多“版本”。这意味着字符串“版本”中的一个单词或短语将包含在HTML div标记中,即
foo bar
。(这些标记是任意的,字体大小属性的数字对应于分数,这些分数稍后将用作其他CSS功能,而这些功能现在是不相关的。)以下是字符串的4个版本:

为客户端创建和管理网站,以安全地进行通信
为客户创建和管理网站,以便进行安全通信
为客户创建和管理网站,以便进行安全通信
为客户创建和管理网站,以便进行安全通信
我想将所有这些版本合并到以下内容中:

为客户创建和管理安全通信的网站

正如我们在这里看到的,有重叠的标记(在
font-size:2
font-size:1
的标记中)。字符串的版本数可能介于1到50之间,因此可能存在多个重叠

以下是到目前为止我使用正则表达式得到的结果:

重新导入

div_str=“这不是一个正确的答案

我要提到的是,用正则表达式解析HTML通常会给生活带来不必要的困难

从您作为示例提供的每一行中恢复文本很容易。我假设每一行都是更大结构的一部分;因此,我将每一行都包含在
div

在这里,我使用BeautifulSoup从您的每一行中获取文本

>>> for line in open('temp.htm').readlines():
...     line = line.strip()
...     print(line)
...     soup = bs4.BeautifulSoup(line, 'lxml')
...     soup.find('div').text
...     
<div>Created and <div style="font-size: 1">managed</div> websites for clients to communicate securely</div>
'Created and managed websites for clients to communicate securely'
<div>Created and <div style="font-size: 2">managed websites</div> for clients to communicate securely</div>
'Created and managed websites for clients to communicate securely'
<div>Created and managed websites for clients to <div style="font-size: 3">communicate</div> securely</div>
'Created and managed websites for clients to communicate securely'
<div><div style="font-size: 4">Created</div> and managed websites for clients to communicate securely</div>
'Created and managed websites for clients to communicate securely'
>>用于打开的行('temp.htm')。readlines():
…line=line.strip()
…打印(行)
…soup=bs4.BeautifulSoup(行“lxml”)
…soup.find('div').text
...     
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”

不幸的是,我不明白通常如何将输入行映射到输出HTML。

这不是一个正确的答案

我要提到的是,用正则表达式解析HTML通常会给生活带来不必要的困难

从您作为示例提供的每一行中恢复文本很容易。我假设每一行都是更大结构的一部分;因此,我将每一行都包含在
div

在这里,我使用BeautifulSoup从您的每一行中获取文本

>>> for line in open('temp.htm').readlines():
...     line = line.strip()
...     print(line)
...     soup = bs4.BeautifulSoup(line, 'lxml')
...     soup.find('div').text
...     
<div>Created and <div style="font-size: 1">managed</div> websites for clients to communicate securely</div>
'Created and managed websites for clients to communicate securely'
<div>Created and <div style="font-size: 2">managed websites</div> for clients to communicate securely</div>
'Created and managed websites for clients to communicate securely'
<div>Created and managed websites for clients to <div style="font-size: 3">communicate</div> securely</div>
'Created and managed websites for clients to communicate securely'
<div><div style="font-size: 4">Created</div> and managed websites for clients to communicate securely</div>
'Created and managed websites for clients to communicate securely'
>>用于打开的行('temp.htm')。readlines():
…line=line.strip()
…打印(行)
…soup=bs4.BeautifulSoup(行“lxml”)
…soup.find('div').text
...     
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”
为客户创建和管理网站,以便进行安全通信
“为客户端创建和管理网站,以安全地进行通信”

不幸的是,我不明白通常情况下,如何将输入行映射到输出HTML。

我找到了它。用BeautifulSoup替换正则表达式以简化解析,我根据div标记之间的文本长度对这些版本进行排序,以避免在查找子字符串时遇到任何问题

使用相同的样本:

为客户端创建和管理网站,以安全地进行通信
为客户创建和管理网站,以便进行安全通信
为客户创建和管理网站,以便进行安全通信
为客户创建和管理网站,以便进行安全通信
这些行在一个列表中表示,然后使用BeautifulSoup按其相应div标记之间的文本长度排序。以下是代码:

def\uu合并字符串(最终版本):
soup=BeautifulSoup(最后的“html.parser”)
对于汤中的固定div。查找所有(“div”):
如果未修复_div.text==version.text:
返回最终的\u str.replace(
version.text,unicode(版本)
)
返回最终搜索
已找到\u术语=(
(i,BeautifulSoup(i,“html.parser”).find(“div”))
因为我发现
)#版本及其div文本的成对列表
已找到\u项=已排序(
找到项,key=lambda x:len(x[-1].text),reverse=True
)#根据div文本的长度进行排序,以避免子字符串问题
当前_div=找到了_terms[0][0]#具有最大div文本的版本
对于x范围内的i(1,len(找到的项)):
当前\u div=\u合并\u字符串(当前\u div,找到的\u项[i][1])

我找到了答案。将regex替换为BeautifulSoup以简化解析,我根据div标记之间的文本长度对这些版本进行排序,以避免在查找子字符串时遇到任何问题

使用相同的样本:

为客户端创建和管理网站,以安全地进行通信
为客户创建和管理网站,以便进行安全通信
为客户创建和管理网站,以便进行安全通信
为客户创建和管理网站,以便进行安全通信
<