我是一个 python 新手,目前正在编写一个 python 脚本来从文本中提取时间表达式并将其转换为实际日期。
我有时在一行中有多个时间表达式,但是我的代码仅检索第一个表达式。每个表达式都以“{”开头并以“}”结尾。
我已经尝试了一些东西(while 循环、for 循环),但我找不到应该如何使其工作。我也尝试将行分成两部分,但是脚本错误......
这是我的功能:
for in_line in file:
with open('file.txt', 'a+') as outfile:
if '{' in in_line:
start_expression = in_line.find('{')
start_values = in_line.find("values=")
end = in_line.find("}")
expression_temporelle = in_line[start_expression:end+1]
values = in_line[start_values+7:end]
print expression_temporelle
self.retrieve_expression(expression_temporelle, values, in_line, outfile)
(注意:其余代码功能,如果表达式位于不同行,则所有表达式都会正确获取和转换)
这是它打印的内容:(我在另一个程序上运行原始文本,该程序将其呈现为这种格式)
{20 avril 2015,20 avril 2015.Time+Date+format=JJ_mois_AAAA+values=20+avril+2015} // temporal expression extracted
Reçu le [20-4-2015], CONCERNE : XXXXXXXXXXXXXXXXXXXXXXXXXX ({07/04/1961,07/04/1961.Time+Date_naissance+format=JJ-MM-AAAA+values=07-04-1961}) // new sentence with only the first expression transformed
感谢您的帮助:)
抱歉,我意识到我不太清楚发送给脚本的内容等。 我现在给脚本提供一个文本(对于上面显示的答案),我给出“Reçu le {20 avril 2015,20 avril 2015.Time+Date+format=JJ_mois_AAAA+values=20+avril+2015} CONCERNE : XXXXXXXXXXXXXXXXXXXXXXXXXXX ({07/04/1961,07/04/1961.Time+Date_naissance+format=JJ-MM-AAAA+values=07-04-1961})”到脚本中(原文说“Reçu le 20 avril 2015,关注:XXXXXXXXXXXXXXXXXXXXXXXXXX(né le 07/04/1961)”,但已通过另一个程序修改)。
所以问题是我只提取行中的第一个时间表达式...
最佳答案
文件 abc.txt 中包含以下数据:
Reçu le {20 avril 2015,20 avril 2015.Time+Date+format=JJ_mois_AAAA+values=20+avril+2015} CONCERNE : XXXXXXXXXXXXXXXXXXXXXXXXXX ({07/04/1961,07/04/1961.Time+Date_naissance+format=JJ-MM-AAAA+values=07-04-1961})
Reçu le {21 avril 2015,20 avril 2015.Time+Date+format=JJ_mois_AAAA+values=21+avril+2015} CONCERNE : XXXXXXXXXXXXXXXXXXXXXXXXXX
Reçu le {22 avril 2015,20 avril 2015.Time+Date+format=JJ_mois_AAAA+values=22+avril+2015} CONCERNE : XXXXXXXXXXXXXXXXXXXXXXXXXX
Reçu le {23 avril 2015,20 avril 2015.Time+Date+format=JJ_mois_AAAA+values=23+avril+2015} CONCERNE : XXXXXXXXXXXXXXXXXXXXXXXXXX ({07/04/1961,07/04/1961.Time+Date_naissance+format=JJ-MM-AAAA+values=07-04-1961})
文件中每一行的简单 str.split('}')
即可完成这项工作
infile = open('abc.txt','r')
line_count = 0
for in_line in infile:
line_count +=1
parts = in_line.split('}')
part_count = 0
for part in parts:
if '{' in part:
part_count +=1
start_expression = part.find('{')
start_values = part.find("values=")
expression_temporelle = part[start_expression:]
values = part[start_values+7:]
print "line", str(line_count)
print " part", str(part_count)
print " ", expression_temporelle+"}" #add back the } for printing
infile.close()
结果:
line 1
part 1
{20 avril 2015,20 avril 2015.Time+Date+format=JJ_mois_AAAA+values=20+avril+2015}
line 1
part 2
{07/04/1961,07/04/1961.Time+Date_naissance+format=JJ-MM-AAAA+values=07-04-1961}
line 2
part 1
{21 avril 2015,20 avril 2015.Time+Date+format=JJ_mois_AAAA+values=21+avril+2015}
line 3
part 1
{22 avril 2015,20 avril 2015.Time+Date+format=JJ_mois_AAAA+values=22+avril+2015}
line 4
part 1
{23 avril 2015,20 avril 2015.Time+Date+format=JJ_mois_AAAA+values=23+avril+2015}
line 4
part 2
{07/04/1961,07/04/1961.Time+Date_naissance+format=JJ-MM-AAAA+values=07-04-1961}
您可以使用 re
而不是标准拆分,即 parts = re.split('(})', in_line)
,这会留下 }
在列表中。
>>> x = "Reçu le {20 avril 2015,20 avril 2015.Time+Date+format=JJ_mois_AAAA+values=20+avril+2015} CONCERNE : XXXXXXXXXXXXXXXXXXXXXXXXXX ({07/04/1961,07/04/1961.Time+Date_naissance+format=JJ-MM-AAAA+values=07-04-1961})"
>>> s = x.split('}')
>>> s
['Re\xc3\xa7u le {20 avril 2015,20 avril 2015.Time+Date+format=JJ_mois_AAAA+values=20+avril+2015', ' CONCERNE : XXXXXXXXXXXXXXXXXXXXXXXXXX ({07/04/1961,07/04/1961.Time+Date_naissance+format=JJ-MM-AAAA+values=07-04-1961', ')']
>>> s = re.split('(})', x)
>>> s
['Re\xc3\xa7u le {20 avril 2015,20 avril 2015.Time+Date+format=JJ_mois_AAAA+values=20+avril+2015', '}', ' CONCERNE : XXXXXXXXXXXXXXXXXXXXXXXXXX ({07/04/1961,07/04/1961.Time+Date_naissance+format=JJ-MM-AAAA+values=07-04-1961', '}', ')']
关于Python,从一行中提取所有表达式的问题(仅提取第一个),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43569689/