【问题标题】:How to insert a newline in list using regex in python 2.7?如何在 python 2.7 中使用正则表达式在列表中插入换行符?
【发布时间】:2019-08-09 15:37:05
【问题描述】:

我正在尝试从 OCR 扫描中创建有序数据集。我通过制作一个包含所有“单位”的列表来预处理结果 - 用换行符分隔。 这看起来像这样:

[' 525-11 Prof.Dr.F.J.A.Kreuzer, Nijmegen  onderzoek met betrekking tot de fysiologie van ademhaling en bloedsomloop op grote hoogte  17.500\n', 
' 527-7 Dr.G.Buyze, Utrecht  onderzoek naar het kopermetabolisme bij geesteszicken  s 9.400\n', 
' 527-8  Prof. Dr. Elisabeth P.Steyn Parv\xc3\xa9, Utrecht onderzoek naar de betekenis van thiaminc voor de synthese van vetzuren in het dierlijk lichaam  s 5.400\n', 
' 532-7 Dr.J.K. Sch\xc3\xb6nfeld, Rotterdam  onderzoek over de rol van de L-fase van bacteri\xc3\xabn bij chronische en recidiverende ziekten (1962)  f 3.100\n', 
' 532-8  A.G.Schuitemaker, Heiloo  onderzoek naar het lytisch vermogen van bacteriofagen voor mycobacteri\xc3\xabn f 2.000\n', 
' 542-13 Dr.B.Leijnse en Dr.H.M. van Praag, Rotterdam  bestudering van het werkingsmechanisme van de anti-depressieve hydrazinen, in bio chemisch en psychiatrisch-psychologisch opzicht  f 16.000\n', 
' 547-7 Dr.H.K.A. Visser, Groningen  onderzoek over de werking van het antidiuretische hormoon en de regulatie van de centrale afgifte van dit hormoon gedurende de kinderleeftijd (1962)  s 9.600\n', 
' 548-4 Dr.F.Schwarz, Utrecht  onderzoek naar de invloed van Exophthalmos Producing Substance op bindweefsel  s 13.000\n', 
' 562-8 Prof. Dr.J.Droogleever Fortuyn, Groningen  onderzoek naar bouw en functie van de middenhersenen (1960-1962) f 13.100\n', 
' '
]

我现在想在用这个正则表达式标识的所有模式之后插入换行符 (\n):

r" ([0-9]+[-][0-9])"

所以结果应该是,例如:

525-11
Prof.Dr.F.J.A.Kreuzer, Nijmegen  onderzoek met betrekking tot de fysiologie van ademhaling en bloedsomloop op grote hoogte  17.500

527-7 Dr.G.Buyze, Utrecht  onderzoek naar het kopermetabolisme bij geesteszicken  s 9.400

527-8  Prof. Dr. Elisabeth P.Steyn Parv, Utrecht onderzoek naar de betekenis van thiaminc voor de synthese van vetzuren in het dierlijk lichaam  s 5.400

我尝试创建一个循环,其中所有匹配模式都替换为相同的匹配模式 + 一个新行。但这似乎只工作一次,所以看起来循环出了点问题。有谁知道具体出了什么问题?

    #import Regular Expression library
    import re

    #Open a the preprosseced text file
    g = open('outputtest2.txt', 'r')
    h = open('outputtest3.txt', 'w')
    SingularStringTextDOC = g.readlines()
    aanvr = re.compile(r" ([0-9]+[-][0-9])")

    #Test how the string works
    print(SingularStringTextDOC)

    #Make a Loop in which in every line in the text of outputtest1.txt is 
    searched for submission number
    for line in SingularStringTextDOC:
        if aanvr.match(line):
            AddLine = re.sub(r" ([0-9]+[-][0-9]+)", '\g<1>\n', line)

    #test result
    print(AddLine)

    #create a new file in which the new lines are added
    IsolatedSubmissionText_Aanvrnum = h.write(AddLine)

结果(包括测试打印):

[ ' 515-16  Prof. Dr.D.B.Kroon, Amsterdam onderzoek naar samenstelling en structuur van ooglens-ciwitten  f 16.900\n', 
" 521-21 Prof.Dr.E.C.Slater, Amsterdam  onderzoek over aard en werkingsmechanisme van de zogenaamde 'relaxing factor' (1960  1962)  f 12.000\n", 
' 525-11 Prof.Dr.F.J.A.Kreuzer, Nijmegen  onderzoek met betrekking tot de fysiologie van ademhaling en bloedsomloop op grote hoogte  17.500\n', 
' 527-7 Dr.G.Buyze, Utrecht  onderzoek naar het kopermetabolisme bij geesteszicken  s 9.400\n', 
' 527-8  Prof. Dr. Elisabeth P.Steyn Parv\xc3\xa9, Utrecht onderzoek naar de betekenis van thiaminc voor de synthese van vetzuren in het dierlijk lichaam  s 5.400\n', 
' 532-7 Dr.J.K. Sch\xc3\xb6nfeld, Rotterdam  onderzoek over de rol van de L-fase van bacteri\xc3\xabn bij chronische en recidiverende ziekten (1962)  f 3.100\n', 
' 532-8  A.G.Schuitemaker, Heiloo  onderzoek naar het lytisch vermogen van bacteriofagen voor mycobacteri\xc3\xabn f 2.000\n', 
' 542-13 Dr.B.Leijnse en Dr.H.M. van Praag, Rotterdam  bestudering van het werkingsmechanisme van de anti-depressieve hydrazinen, in bio chemisch en psychiatrisch-psychologisch opzicht  f 16.000\n', 
' 547-7 Dr.H.K.A. Visser, Groningen  onderzoek over de werking van het antidiuretische hormoon en de regulatie van de centrale afgifte van dit hormoon gedurende de kinderleeftijd (1962)  s 9.600\n', 
' 548-4 Dr.F.Schwarz, Utrecht  onderzoek naar de invloed van Exophthalmos Producing Substance op bindweefsel  s 13.000\n', 
' 562-8 Prof. Dr.J.Droogleever Fortuyn, Groningen  onderzoek naar bouw en functie van de middenhersenen (1960-1962) f 13.100\n', ' ']

562-8

Prof. Dr.J.Droogleever Fortuyn, Groningen  onderzoek naar bouw en functie van de middenhersenen (1960-1962) f 13.100

【问题讨论】:

  • AddLine = re.sub(r" ([0-9]+[-][0-9]+)", '\g&lt;1&gt;\n', line) 之后的同一缩进级别上尝试 print(AddLine),而不是从头开始。
  • 谢谢!就是这样:我现在明白了,我还必须在循环的相同缩进级别上编写..
  • 您对如何在另一个匹配模式之前插入换行符 (\n) 有任何想法吗?
  • 您的意思是在捕获组之前插入换行符吗? \n\g&lt;1&gt;\nregex101.com/r/mjDtDj/1
  • 我已将其添加为答案。

标签: python regex python-2.7 loops newline


【解决方案1】:

我猜你可能只是想在你的表达式中添加单词边界,+ 似乎也不见了:

\s\b[0-9]+-[0-9]+\b

虽然不确定。

测试

import re

l = [' 525-11 Prof.Dr.F.J.A.Kreuzer, Nijmegen  onderzoek met betrekking tot de fysiologie van ademhaling en bloedsomloop op grote hoogte  17.500\n', 
' 527-7 Dr.G.Buyze, Utrecht  onderzoek naar het kopermetabolisme bij geesteszicken  s 9.400\n', 
' 527-8  Prof. Dr. Elisabeth P.Steyn Parv\xc3\xa9, Utrecht onderzoek naar de betekenis van thiaminc voor de synthese van vetzuren in het dierlijk lichaam  s 5.400\n', 
' 532-7 Dr.J.K. Sch\xc3\xb6nfeld, Rotterdam  onderzoek over de rol van de L-fase van bacteri\xc3\xabn bij chronische en recidiverende ziekten (1962)  f 3.100\n', 
' 532-8  A.G.Schuitemaker, Heiloo  onderzoek naar het lytisch vermogen van bacteriofagen voor mycobacteri\xc3\xabn f 2.000\n', 
' 542-13 Dr.B.Leijnse en Dr.H.M. van Praag, Rotterdam  bestudering van het werkingsmechanisme van de anti-depressieve hydrazinen, in bio chemisch en psychiatrisch-psychologisch opzicht  f 16.000\n', 
' 547-7 Dr.H.K.A. Visser, Groningen  onderzoek over de werking van het antidiuretische hormoon en de regulatie van de centrale afgifte van dit hormoon gedurende de kinderleeftijd (1962)  s 9.600\n', 
' 548-4 Dr.F.Schwarz, Utrecht  onderzoek naar de invloed van Exophthalmos Producing Substance op bindweefsel  s 13.000\n', 
' 562-8 Prof. Dr.J.Droogleever Fortuyn, Groningen  onderzoek naar bouw en functie van de middenhersenen (1960-1962) f 13.100\n', 
' '
]

regex = r"(\s\b[0-9]+-[0-9]+\b)"
subst = "\\1\\n"


for index,item in enumerate(l):
    l[index] = re.sub(regex, subst, item)

print(l)

输出

[' 525-11\n Prof.Dr.F.J.A.Kreuzer, Nijmegen onderzoek 遇到了 betrekking tot de fysiologie van ademhaling en bloedsomloop op grote hoogte 17.500\n', ' 527-7\n Dr.G.Buyze, Utrecht onderzoek naar het kopermetabolisme bij geesteszicken s 9.400\n', ' 527-8\n Prof. Dr. Elisabeth P.Steyn Parvé, Utrecht onderzoek naar de betekenis van thiaminc voor de synthese van vetzuren in het dierlijk lichaam s 5.400\n', ' 532-7\n Dr.J.K. Schönfeld, 鹿特丹 onderzoek over de rol van de L-fase van bacteriën bij chronische en recidiverende ziekten (1962) f 3.100\n', ' 532-8\n A.G.Schuitemaker, Heiloo onderzoek naar het lytisch vermogen van bacteriofagen voor 分枝杆菌 f 2.000\n', ' 542-13\n Dr.B.Leijnse en Dr.H.M.面包车 Praag, Rotterdam bestuding van het werkingsmechanisme van de 抗抑郁剂肼,生物化学 psychiatrisch-psychologisch opzicht f 16.000\n', ' 547-7\n Dr.H.K.A. Visser, Groningen onderzoek over de werking van het antidiuretische 荷尔蒙 en de regulatie van de centrale afgifte van dit 荷尔蒙 gedurende de kinderleftijd (1962) s 9.600\n', ' 548-4\n Dr.F.Schwarz, Utrecht onderzoek naar de invloed van Exophthalmos 生产物质 op bindweefsel s 13.000\n', ' 562-8\n Prof. Dr.J.Droogleever Fortuyn, Groningen onderzoek naar bouw en functie van de middenhersenen (1960-1962) f 13.100\n', ' ']

表达式在regex101.com 的右上方面板中进行了解释,如果您想探索/简化/修改它,在this link 中,您可以查看它如何与一些示例输入进行匹配,如果您愿意的话。

【讨论】:

  • 这没有回答问题。
  • 谢谢Emma,这样的话,我得换个方法了。但它也能解决问题!
  • 对于示例数据,第一个模式中是否缺少 + 并不重要,因为它只是由 re.match 完成的检查,它将成功,因为两者中的数字后面都没有模式。下一个子确实包含第二个+。为什么在\s 之后匹配单词边界\b?第二个\b 没有区别,因为在示例数据中,数字后跟一个空格。请注意,OP 使用空格,\s 也匹配换行符,这可能会产生意想不到的结果。为什么使用捕获组而不是 \s\b[0-9]+-[0-9]+\b 并替换为 r"\g&lt;0&gt;\n"
【解决方案2】:

要获得 AddLine 的值,您必须在 AddLine = re.sub(r" ([0-9]+[-][0-9]+)", '\g&lt;1&gt;\n', line) 下的相同缩进级别使用 print(AddLine)

如果您希望捕获组从新行开始,您可以在捕获组前面添加\n

\n\g<1>\n

请注意,在模式中,您也可以匹配没有字符类的连字符:

([0-9]+-[0-9]+)

Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多