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

如何在python正则表达式中使用多行标志?,python,regex,Python,Regex,我想用正则表达式将文本块转换成单行条目数据库。但我不知道为什么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>

我想用正则表达式将文本块转换成单行条目数据库。但我不知道为什么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()
预期产出:

210
Création de l'euro ;...
... ;...
... ;...
编辑:我尝试将nmx更改为匹配\n或\r\n,但没有结果:

nmx=r"(?P<ename>.+)(\n|\r\n)Afficher le"
nmx=r“(?P.+)(\n | \r\n)词缀”
在此致以最诚挚的问候:

nm1 = re.search(nmx,line, re.M)
您将获得一个非类型对象(nm1=None),因为找不到匹配项。因此,对nmx属性进行更多的研究,为什么在正则表达式中没有匹配项

顺便说一句,如果有可能获得一个非类型对象,您可以通过阻止非类型对象来避免这种情况:

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

nm1 = re.search(nmx,line, re.M)
您将获得一个非类型对象(nm1=None),因为找不到匹配项。因此,对nmx属性进行更多的研究,为什么在正则表达式中没有匹配项

顺便说一句,如果有可能获得一个非类型对象,您可以通过阻止非类型对象来避免这种情况:

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

如果你一次只读一行,正则表达式就无法与你读过的前一行匹配,然后就忘记了


如果读取一组行,可以将正则表达式应用于行集合,多行标志将起到一些有用的作用。但您当前的代码可能只需搜索
r'^Afficher\.\.\.\.\.
,并使用状态机(
start==0
start==1
)在正确的上下文中执行此操作。

如果您一次只读取一行,则正则表达式无法匹配您已阅读但又忘记的前一行


如果读取一组行,可以将正则表达式应用于行集合,多行标志将起到一些有用的作用。但是您当前的代码可能只需搜索
r'^Afficher\.\.\.\.\.
,并使用状态机(
start==0
start==1
)在正确的上下文中执行此操作。

输入是否真的需要在CP1252中?在现代社会,这似乎是一个奇怪的选择,可能是你找不到匹配项的原因。它可能是utf8格式的。它是UTF-8格式的,你读错了,或者怎么了?我们会遇到很多问题,人们不理解编码,或者猜错了,因此查看文件中到底有多少字节会很有帮助(只有几个字节——仅仅显示
é
是如何编码就足够了)。Notepad++说编码是ANSI。这主要说明了Windows术语的无用性(和/或可能是记事本++)但我猜在你的例子中,ANSI意味着你在Windows上的默认语言环境。如果是CP1252,那么é将被编码为字节0xe9十六进制。输入真的需要用CP1252吗?在现代世界,这似乎是一个奇怪的选择,可能是你找不到匹配的原因。它可以是utf8。它是UTF-8,你读错了,或者什么t?我们会遇到很多问题,人们不理解编码,或者猜错了,因此查看文件中到底有哪些字节是很有帮助的(只有几个字节——仅仅显示
é
是如何编码就足够了)。Notepad++说编码是ANSI。这主要说明了Windows术语的无用性(和/或可能是记事本++),但我猜在你的例子中,ANSI意味着你在Windows上的默认语言环境。如果是CP1252,那么é将被编码为字节0xe9十六进制。无论我试图修改nmx属性,它都能工作。你能更详细地解释一下,输入和输出文件应该是什么样子吗?介于“210个英国人的结婚纪念日”和“结婚纪念日”。。。“每个以\n或\n\r结尾的文本行都必须在输出文件中?我通过将前一行存储在变量中并与当前正在处理的行联接来解决此问题。无论我如何修改nmx属性,它都会起作用。您能更详细地解释输入和输出文件的外观吗?介于“210 célébrités ouévènements ontététrouvés pour la date du 1er janvier.”和“Afficher le…”每一个以\n或\r结尾的文本行都必须在输出文件中?我通过将前一行存储在一个变量中并与当前正在处理的行连接,解决了这个问题。