Python 如何在CSV文件中添加使用正则表达式找到的信息

Python 如何在CSV文件中添加使用正则表达式找到的信息,python,regex,csv,regex-group,Python,Regex,Csv,Regex Group,我正在尝试将新信息“附加”到CSV文件中。问题在于,该信息不在数据帧结构中,而是使用正则表达式从文本中提取的信息。示例文本将是下一个: Lorem ipsum dolor sit amet,是一位杰出的献身者。Etiam内径 波苏尔、埃利芬德直径、调味品胡斯托。佩伦茨克莫利斯酒店 直径相同 TITLE-SDFSD-DFDS-SFDS-01-01:这是 被分成两行,中间有一个空行 佩伦茨克温和的权杖佩伦茨克。Sed nec quam 普卢斯。我不能告诉你,你是怎么想的 泰勒斯。维尼那提斯学院是一所

我正在尝试将新信息“附加”到CSV文件中。问题在于,该信息不在数据帧结构中,而是使用正则表达式从文本中提取的信息。示例文本将是下一个:

Lorem ipsum dolor sit amet,是一位杰出的献身者。Etiam内径 波苏尔、埃利芬德直径、调味品胡斯托。佩伦茨克莫利斯酒店 直径相同

TITLE-SDFSD-DFDS-SFDS-01-01:这是

被分成两行,中间有一个空行

佩伦茨克温和的权杖佩伦茨克。Sed nec quam 普卢斯。我不能告诉你,你是怎么想的 泰勒斯。维尼那提斯学院是一所充满活力的学院。纳勒姆·埃吉特 托托·奎姆。莫比·塞德·利奥和阿尔库·阿利奎特·卢克图斯

开业日期2021年4月15日

截止日期2021年8月26日

指示性预算:本专题的指示性预算总额为欧元 2000万

标题-SDFSD-DFDS-SFDS-01-02;这是一行中的标题2

在达格尼塞姆,人们的生活条件非常恶劣。梅塞纳斯 康茂德·普鲁斯·尼布,一个临时的奥古斯前庭封建者。前庭 多洛·内克,射手座,福西布斯河畔

开业日期2021年3月15日

截止日期2021年8月17日

指示性预算:本专题的指示性预算总额为欧元 1500万

标题-SDFSD-DFDS-SFDS-01-03:这是一个标题3,太长,需要花费时间 两行

在达格尼塞姆,人们的生活条件非常恶劣。梅塞纳斯 康茂德·普鲁斯·尼布,一个临时的奥古斯前庭封建者。前庭 多洛·内克,射手座,福西布斯河畔

开业日期2021年5月15日

截止日期2021年9月26日

指示性预算:本专题的指示性预算总额为欧元 500万

要提取所有信息,我必须进行多次交互以提取我需要的信息。我知道我可以将一次迭代细分为几个组,但很难找到一个正则表达式。相反,我使用了其中几个:

import re
import csv
    
with open('doubt2.txt','r', encoding="utf-8") as f:
    f_contents = f.read()

regexHOR =r'\n(TITLE-\S+-\d{2}-\d{2})[:|;](.*?)^Conditions'
regexOD = r'^Opening date\s+(\d{1,2} \w+ \d{4})\s*?'
regexDL =r'^Deadline\s+(\d+ \w+ \d+)'

patternHOR = re.compile(regexHOR, re.MULTILINE | re.DOTALL)
patternOD = re.compile(regexOD, re.MULTILINE | re.DOTALL)
patternDL = re.compile(regexDL, re.MULTILINE | re.DOTALL)

matchesHOR = patternHOR.finditer(f_contents)
matchesOD = patternOD.finditer(f_contents)
matchesDL = patternDL.finditer(f_contents)
marchesHOR
查找两个组,而其他匹配项仅为一个组。一旦匹配完成,我必须将其导出到CSV文件中,执行下一个代码:

with open("result.csv", "w",newline='') as outfile:
    csvfile = csv.writer(outfile)
    csvfile.writerow(['Topic ID', 'Title', 'Opening date', 'Deadline'])
    for match in matchesHOR:
        csvfile.writerow([match.group(1), match.group(2).replace('\n', ' '),'',''])
    for match in matchesOD:
        csvfile.writerow(['','',match.group(1),''])
    for match in matchesDL:
        csvfile.writerow(['','','',match.group(1)])
问题是,当我在
匹配或
之后编写新的nows时,它将我放在下面,如您在下表中所示:

代码 标题 开放 截止日期 代码1 标题1 代码2 标题2 代码3 标题3 开场白1 开场白2 开场白3 截止日期1 截止日期2 截止日期3
您需要重新安排一些内容,以便同时为一行写入所有项目。这里的方法是使用
match\u hor
查找每个标题开头,然后将其用作
match\u od
的起点,然后将其用作
match\u dl
的起点

import re
import csv
    
with open('doubt2.txt','r', encoding="utf-8") as f:
    f_contents = f.read()

regexHOR = r'\n(TITLE-\S+-\d{2}-\d{2})[:|;](.*?)^Conditions'
regexOD = r'^Opening date\s+(\d{1,2} \w+ \d{4})\s*?'
regexDL =r'^Deadline\s+(\d+ \w+ \d+)'

patternHOR = re.compile(regexHOR, re.MULTILINE | re.DOTALL)
patternOD = re.compile(regexOD, re.MULTILINE | re.DOTALL)
patternDL = re.compile(regexDL, re.MULTILINE | re.DOTALL)

with open("result.csv", "w",newline='') as outfile:
    csvfile = csv.writer(outfile)
    csvfile.writerow(['Topic ID', 'Title', 'Opening date', 'Deadline'])
    
    for match_hor in patternHOR.finditer(f_contents):
        code, title = [match_hor.group(1), match_hor.group(2).replace('\n', ' ')]
        offset = match_hor.end()
        
        match_od = patternOD.search(f_contents[offset:])
        offset += match_od.end()
        opening = match_od.group(1)
        
        match_dl = patternDL.search(f_contents[offset:]) 
        offset += match_dl.end()
        deadline = match_dl.group(1)
        
        csvfile.writerow([code, title.strip(), opening, deadline])
这将为您提供包含以下内容的
result.csv

主题ID、标题、开幕日期、截止日期
TITLE SDFSD-DFDS-SFDS 01-01,这是标题1,它被分成两条线,中间有一条空行,15个APR2021,26个AUG 2021。
标题-SDFSD-DFDS-SFDS-01-02,这是一行标题2,2021年3月15日,2021年8月17日
标题-SDFSD-DFDS-SFDS-01-03,这是标题3太长,需要两行,2021年5月15日,2021年9月26日

我建议您使用以下代码:

>>> regexHOR = r'(?P<TopicID>TITLE-\S+-\d{2}-\d{2})[:;]\s*(?P<Title>[\w\s]+(?=Conditions))'
>>>
>>> regexOD = r'(?P<OpeningDate>(?<=Opening date )\d{1,2} \w+ \d{4})'
>>>
>>> regexDL = r'(?P<DeadLine>(?<=Deadline )\d+ \w+ \d+)'
>>>
>>>regex_pattern = re.compile('.*?'.join([regexHOR, regexOD, regexDL]), re.MULTILINE | re.DOTALL)
>>>
>>> for match in re.finditer(regex_pattern, f_contents):
        csvfile.writerow([match.group('TopicID'), match.group('Title'), \
        match.group('OpeningDate'), match.group('DeadLine')])
>>regexHOR=r'(?PTITLE-\S+-\d{2}-\d{2})[:;]\S*(?P[\w\S]+(?=条件))'
>>>

>>>regexOD=r'(?P(?)您不能将所有regex组合在一个中并使用命名组
(?P…)
取而代之?你能发布
regexHOR
和其他的内容吗?@IronFist我不知道如何按照你的建议组合名称。我会尝试在问题中添加更多信息,以使其更准确clear@IoaTzimas你能帮我吗?这几乎是我需要的。但是如果你看到,最后期限栏总是2021年8月26日,但是如果你检查一下原文中,三种情况下的截止日期是不同的。这是为什么?第二个偏移量也需要添加,它是在错误的点开始搜索的。我仍然需要了解执行过程的内容:
match_dl=patternDL.search(f_contents[match_hor.end()+match_od.end():])
,括号中的内容主要是整个文本。因此,不要将整个文本传递给搜索,只需从上次搜索完成的偏移量开始传递一个片段。在我真正的问题中,我必须添加第六列,即
match\u con=patternCON.search(f\u contents[match\u hor.end())+match_od.end()+match_dl.end()+match_bg.end():])
在那一行之后
contribution=match_con.group(1)
但我总是得到错误:
AttributeError:'NoneType'对象没有属性'group'。