【问题标题】:Combining various lines in a long .txt in python在python中组合长.txt中的各种行
【发布时间】:2017-02-17 12:01:56
【问题描述】:

我在转换 word-exported-html 文件时遇到问题。我需要获取包含所有样式信息(粗体、斜体...)的 .doc 文件的文本。我的代码中的标签清理器运行良好,现在我有了一个只有标签的 result.txt。

现在的问题是,html-export 会在不应该的地方拆分行。他可能会将 \n 放在一行之间。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
    <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
    <TITLE>19</TITLE>
    <META NAME="GENERATOR" CONTENT="OpenOffice 4.1.3  (Unix)">
    <META NAME="AUTHOR" CONTENT="IGM">
    <META NAME="CREATED" CONTENT="20160425;12590000">
    <META NAME="CHANGEDBY" CONTENT="Arno Michalowski">
    <META NAME="CHANGED" CONTENT="20160425;13460000">
    <META NAME="SDFOOTNOTE" CONTENT=";;;;C">
    <STYLE TYPE="text/css">
    <!--
        @page { margin-right: 3.6cm; margin-top: 2.4cm; margin-bottom: 3.4cm }
            P { margin-left: 2cm; text-indent: -2cm; margin-bottom: 0.21cm; direction: ltr; color: #000000; line-height: 0.49cm; text-align: justify; widows: 2; orphans: 2 }
            P.western { font-family: "Times", serif; font-size: 12pt; so-language: de-DE }
            P.cjk { font-family: "Times New Roman", serif; font-size: 12pt }
            P.ctl { font-family: "Times", serif; font-size: 10pt; so-language: ar-SA }
            P.sdfootnote-western { margin-left: 3cm; text-indent: -1cm; margin-bottom: 0cm; font-family: "Times", serif; font-size: 10pt; so-language: de-DE; line-height: 0.42cm; text-align: left }
            P.sdfootnote-cjk { margin-left: 3cm; text-indent: -1cm; margin-bottom: 0cm; font-family: "Times New Roman", serif; font-size: 10pt; line-height: 0.42cm; text-align: left }
            P.sdfootnote-ctl { margin-left: 3cm; text-indent: -1cm; margin-bottom: 0cm; font-family: "Times", serif; font-size: 10pt; so-language: ar-SA; line-height: 0.42cm; text-align: left }
            A.sdfootnoteanc { font-size: 57% }
            A.sdfootnotesym-western { font-family: "Times", serif; font-size: 10pt }
        A.sdfootnotesym-cjk { font-size: 10pt }
        A.sdfootnotesym-ctl { font-family: "Times", serif }
	-->
	</STYLE>
</HEAD>
<BODY LANG="en" TEXT="#000000" DIR="LTR">
<DIV TYPE=HEADER>
    <P LANG="de-DE" ALIGN=CENTER STYLE="margin-bottom: 0.9cm"><SDFIELD TYPE=PAGE SUBTYPE=RANDOM FORMAT=PAGE>184</SDFIELD></P>
</DIV>
<P LANG="de-DE" ALIGN=RIGHT STYLE="margin-left: 0.3cm; text-indent: 0cm; margin-bottom: 0cm; line-height: 0.42cm">
<FONT FACE="Courier, monospace"><FONT SIZE=2><SPAN STYLE="font-weight: normal">	</SPAN></FONT></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US"><SPAN STYLE="font-weight: normal">19</SPAN></SPAN></FONT></P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Courier, monospace"><FONT SIZE=2><SPAN LANG="en-US">	</SPAN></FONT></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">1		</SPAN></FONT><FONT FACE="Times, serif"><I><B><SPAN LANG="en-US">M</SPAN></B></I></FONT><SUP><FONT FACE="Times, serif"><FONT SIZE=2><I><B><SPAN LANG="en-US">r</SPAN></B></I></FONT></FONT></SUP><FONT FACE="Times, serif"><I><B><SPAN LANG="en-US">.
Bavoil</SPAN></B></I></FONT><FONT FACE="Courier, monospace"><FONT SIZE=2><SPAN LANG="en-US">
</SPAN></FONT></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">-
56 ans - clincailler au quai au</SPAN></I></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">[</SPAN></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">x</SPAN></I></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">]</SPAN></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">
fleur</SPAN></I></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">[</SPAN></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">s</SPAN></I></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">]</SPAN></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">
-</SPAN></I></FONT></P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Courier, monospace"><FONT SIZE=2><SPAN LANG="en-US"><I>	</I></SPAN></FONT></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">2			</SPAN></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">100
toujours l'ouïe</SPAN></I></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">°</SPAN></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">
dure</SPAN></I></FONT></P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Courier, monospace"><FONT SIZE=2><SPAN LANG="en-US">	</SPAN></FONT></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">3	</SPAN></FONT><FONT FACE="Times, serif"><I><B><SPAN LANG="en-US">	26
mai</SPAN></B></I></FONT><SUP><FONT FACE="Times, serif"><FONT SIZE=2><A CLASS="sdfootnoteanc" NAME="sdfootnote1anc" HREF="#sdfootnote1sym"><SUP>1</SUP></A></FONT></FONT></SUP><FONT FACE="Courier, monospace"><FONT SIZE=2><SPAN LANG="en-US"><I>
</I></SPAN></FONT></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">-
l'oreille droite jette du pus depuis 6 ou 8 mois - ce mois</SPAN></I></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">[</SPAN></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">-</SPAN></I></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">]</SPAN></FONT></P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Courier, monospace"><FONT SIZE=2><SPAN LANG="en-US"><I>	</I></SPAN></FONT></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">4			</SPAN></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">ci
encore plus - surdité de cette oreille depuis 2 mois</SPAN></I></FONT></P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Times, serif"><I><SPAN LANG="en-US">	</SPAN></I></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">5			</SPAN></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">il
a eu un coup d'air en route - depuis 15 ans il a eu</SPAN></I></FONT></P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Times, serif"><I><SPAN LANG="en-US">	</SPAN></I></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">6			</SPAN></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">l'oreille
dure alternativement l'une et l'autre -</SPAN></I></FONT></P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Times, serif"><I><SPAN LANG="en-US">	</SPAN></I></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">7			</SPAN></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">maintenant
alternativement aussi</SPAN></I></FONT></P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Times, serif"><I><SPAN LANG="en-US">	</SPAN></I></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">8			</SPAN></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">douleur
</SPAN></I></FONT><SUP><FONT FACE="Courier New, monospace"><SPAN LANG="en-US">┌</SPAN></FONT></SUP><FONT FACE="Times, serif"><I><SPAN LANG="en-US">dans</SPAN></I></FONT><SUP><FONT FACE="Courier New, monospace"><SPAN LANG="en-US">┐</SPAN></FONT></SUP><FONT FACE="Times, serif"><I><SPAN LANG="en-US">
sur l'os externe du coude il ne peut rien lever en</SPAN></I></FONT></P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Times, serif"><I><SPAN LANG="en-US">	</SPAN></I></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">9			</SPAN></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">ayant
la main tournée en dedans -</SPAN></I></FONT></P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Times, serif"><I><SPAN LANG="en-US">	</SPAN></I></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">10			</SPAN></FONT><FONT FACE="Times, serif"><I><SPAN LANG="en-US">dort,
mange bien</SPAN></I></FONT></P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Times, serif"><I><SPAN LANG="en-US">	</SPAN></I></FONT><FONT FACE="Times, serif"><SPAN LANG="en-US">11			avant
6 semaines de l'onguent de tart.em. derrière l[']oreille </SPAN></FONT>
</P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Times, serif"><SPAN LANG="en-US">	12			qui
lui poussait de boutons très dou-</SPAN></FONT></P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Times, serif"><SPAN LANG="en-US">	13			loureux
et causait un fièvre°</SPAN></FONT></P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Times, serif"><SPAN LANG="en-US">	14			n'entend
point du tout ma montre d'or à droit[e]</SPAN></FONT></P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Times, serif"><SPAN LANG="en-US">	15			mais
à la gauche en 8 pouce de distance </SPAN></FONT>
</P>
<P LANG="de-DE" CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Times, serif"><SPAN LANG="en-US">	9	*		Tinctura
Sulph. </SPAN></FONT><FONT FACE="Times, serif">1 globule C 30 en 14
C. 1 Spiritus vini</FONT></P>

The want-to file should look like this。但请记住,我现在有带有所有粗体和斜体信息的标签。这只是关于换行符和它们的位置。

每一行都应该以 \t\d 开始,并以换行符结束。但由于那个糟糕的出口,它看起来像this

如何将不以 \t\d 开头的所有行与以 \t\d 开头的第一行合并?

我想使用 re.sub,但我认为我搞砸了正则表达式。我尝试过这样的事情。不幸的是,我的python技能不是那么好,我是一个数字人文主义者。

regex1 = r"(^\t\d.*?)\n(.*?)\n"
final = re.sub(regex1, "\2\1\n", f)

难道没有更快的方法来删除所有不需要的\n吗?

非常感谢您的帮助。任何代码表示赞赏。

【问题讨论】:

  • 我忘了说.doc中的原文大约有1000页。我们还有更多文件要处理。这就是为什么我们应该自动解决它。

标签: python html regex newline


【解决方案1】:

如果后面没有 \t\d,则将 "\n" 替换为 "" 很容易使用正则表达式前瞻。

final = re.sub(r'\n(?!\t\d)', '', f)

如果紧跟在表面匹配之后的文本与前瞻中的 subregex 匹配,则否定前瞻 (?!subregex) 会强制正则表达式引擎跳过匹配。

【讨论】:

  • 非常感谢。这可能会解决我的问题。我要试试看!
【解决方案2】:

假设您的所有 HTML 都在一个名为 mess 的变量中,您可以简单地做一个

mess.replace("\n","")

【讨论】:

  • 那么我将替换所有\n。但我需要它们。这只是关于 \t\d 之前没有出现的 \n
  • @fabsurd 我明白了。虽然我现在无法调查具体问题,但BeautifulSoup 应该能够帮助您。几个小时后我会再次检查,如果到那时还没有解决,我会处理它。
  • 这看起来很棒。我得去看看!
猜你喜欢
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多