Python,从一行中提取所有表达式的问题(仅提取的第一个表达式)

时间:2017-04-23 09:58:55

标签: python

我是一个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çedo{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})“to the script(原文说”Reçule 20 avril 2015,CONCERNE:XXXXXXXXXXXXXXXXXXXXXXXXXX(néle07/04/1961)“但是通过另一个程序进行了修改。”

所以问题是我只提取行中的第一个时间表达式......

2 个答案:

答案 0 :(得分:1)

使用文件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', '}', ')']

答案 1 :(得分:0)

尝试在循环中使用re.findall()将时态表达式转换为列表。将文件的每一行都输入到此文件中以将其拆分,然后将它们附加到新列表中。

re.findall('\{(.*?)\}', line)