如何在python正则表达式中使用多行标志?

时间:2017-12-08 09:19:15

标签: python regex

我想将文本块转换为带有正则表达式的单行条目数据库的数据库。但我不知道为什么正则表达集团没有得到认可。 也许是因为多线标志没有正确设置。 我是python的初学者。

import re
with open("a-j-0101.txt", encoding="cp1252") as f: 
    start=1
    ecx=r"(?P<entrcnt>[0-9]{1,3}) célébrités ou évènements"
    ec1=""
    nmx=r"(?P<ename>.+)\r\nAfficher le.*"
    nm1=""
    for line in f:
        if start == 1:
            out = open('AST0101.txt' + ".txt", "w", encoding="cp1252") #utf8 cp1252
            ec1 = re.search(ecx,line)
            out.write(ec1.group("entrcnt"))
            start=0
        out.write(r"\r\n")
        nm1 = re.search(nmx,line, re.M)
        out.write(str(nm1.group("ename")).rstrip('\r\n'))
    out.close()

但我收到错误:

File "C:\work-python\transform-asth-b.py", line 16, in <module>
  out.write(str(nm1.group("ename")).rstrip('\r\n'))

builtins.AttributeError: 'NoneType' object has no attribute 'group'

这是输入:

210 célébrités ou évènements ont été trouvés pour la date du 1er janvier.
Création de l'euro
Afficher le...
...
...
...

预期产出:

210
Création de l'euro ;...
... ;...
... ;...

编辑:我尝试更改nmx以匹配\ n或\ r \ n但没有结果:

nmx=r"(?P<ename>.+)(\n|\r\n)Afficher le"

最好的问候

2 个答案:

答案 0 :(得分:2)

在此声明中:

nm1 = re.search(nmx,line, re.M)

你得到一个NoneType对象(nm1 =无),因为找不到匹配项。因此,对nmx属性进行更多调查,为什么在正则表达式中没有匹配。

顺便说一句,如果可以获得NoneType对象,可以通过阻止NoneType来避免这种情况:

If nm1 is not None:
   out.write(str(nm1.group("ename")).rstrip('\r\n'))
else:
    #handle your NoneType case

答案 1 :(得分:1)

如果您一次只读一行,则正则表达式无法匹配您之前阅读过然后遗忘的行。

如果您读取了一组行,则可以将正则表达式应用于行集合,并且多行标记将执行一些有用的操作。但是您当前的代码应该只是搜索t1.loadFromFile("images/board.png"); 并使用状态机(r'^Afficher le\.\.\.'start == 0)在正确的上下文中执行此操作。