在Python中查找和替换逻辑

时间:2012-04-13 13:19:47

标签: python python-2.7

在python中我需要一个逻辑用于以下场景我正在使用split函数。 我有一个包含输入的字符串,如下所示。

  

“ID674021384 25/01/1986 heloo嗨感谢5分钟和25-01-1988。”

     

“ID909900000 25-01-1986你好10分钟。”

输出应如下所示,将日期格式替换为“日期”,将时间格式替换为“时间”。

  

“ID674021384 date hello hi thanks time date。”

     

“ID909900000日期问候时间。”

此外,我需要为每个Id计算日期和时间,如下所示

  

ID674021384日期:2时间:1

     

ID909900000日期:1时间:1

3 个答案:

答案 0 :(得分:2)

>>> import re
>>> from collections import defaultdict
>>> lines = ["ID674021384 25/01/1986 heloo hi thanks 5 minutes and 25-01-1988.", "ID909900000 25-01-1986 hello 10 minutes."]
>>> pattern = '(?P<date>\d{1,2}[/-]\d{1,2}[/-]\d{4})|(?P<time>\d+ minutes)'
>>> num_occurences = {line:defaultdict(int) for line in lines}
>>> def repl(matchobj):
        num_occurences[matchobj.string][matchobj.lastgroup] += 1
        return matchobj.lastgroup

>>> for line in lines:
        text_id = line.split(' ')[0]
        new_text = re.sub(pattern,repl,line)    
        print new_text
        print '{0} DATE:{1[date]} Time:{1[time]}'.format(text_id, num_occurences[line])
        print ''


ID674021384 date heloo hi thanks time and date.
ID674021384 DATE:2 Time:1

ID909900000 date hello time.
ID909900000 DATE:1 Time:1

答案 1 :(得分:1)

为了解析类似的文本行,比如日志文件,我经常使用re模块使用正则表达式。虽然split()也适用于分隔不包含空格和日期部分的字段,但使用正则表达式还可以确保格式符合您的预期,如果需要警告您奇怪的输入线。

使用正则表达式,您可以获取日期和时间的各个字段,并从中构建datedatetime个对象(均来自datetime模块)。一旦拥有了这些对象,就可以将它们与其他类似对象进行比较,并编写新条目,根据需要格式化日期。我建议解析整个输入文件(假设你正在读取文件)并编写一个全新的输出文件而不是试图改变它。

至于跟踪日期和时间计数,当您的输入不是太大时,使用字典通常是最简单的方法。当您遇到具有特定ID的行时,请在字典中找到与此ID对应的条目,否则为其添加新条目。此条目本身可以是使用日期和时间作为键的字典,其值是每个遇到的计数。

我希望这个答案能指导您找到解决方案,即使它不包含任何代码。

答案 2 :(得分:0)

您可以使用几个正则表达式:

import re

txt = 'ID674021384 25/01/1986 heloo hi thanks 5 minutes and 25-01-1988.'

retime = re.compile('([0-9]+) *minutes')
redate = re.compile('([0-9]+[/-][0-9]+[/-][0-9]{4})')

# find all dates in 'txt'
dates = redate.findall(txt)
print dates

# find all times in 'txt'
times = retime.findall(txt)
print times

# replace dates and times in orignal string:
newtxt = txt
for adate in dates:
    newtxt = newtxt.replace(adate, 'date')

for atime in times:
    newtxt = newtxt.replace(atime, 'time')

输出如下:

Original string:
ID674021384 25/01/1986 heloo hi thanks 5 minutes and 25-01-1988.
Found dates:['25/01/1986', '25-01-1988']
Found times: ['5']

New string:
ID674021384 date heloo hi thanks time minutes and date.

Dates and times found:
ID674021384 DATE:2 TIME:1

克里斯