Python 如何在CSV文件中添加使用正则表达式找到的信息
我正在尝试将新信息“附加”到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万 要提取所有信息,我必须进行多次交互以提取我需要的信息。我知道我可以将一次迭代细分为几个组,但很难找到一个正则表达式。相反,我使用了其中几个: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 普卢斯。我不能告诉你,你是怎么想的 泰勒斯。维尼那提斯学院是一所
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'。
。