Python中的正则表达式替换

时间:2009-05-26 02:48:22

标签: python regex timestamp

我有一个包含多个条目的CSV文件,每个条目都有2个unix时间戳格式的日期。

我有一个名为convert()的方法,它接受时间戳并将其转换为YYYYMMDD

现在,由于每行有2个时间戳,如何用新值替换每个时间戳?

编辑:为了澄清,我想将每次出现的时间戳转换为YYYYMMDD格式。这就是困扰我的事情,因为re.findall()会返回一个列表。

4 个答案:

答案 0 :(得分:3)

如果您知道替换件:

p = re.compile( r',\d{8},')
p.sub( ','+someval+',', csvstring )

如果是格式更改:

p = re.compile( r',(\d{4})(\d\d)(\d\d),')
p.sub( r',\3-\2-\1,', csvstring )
编辑:对不起,刚刚意识到你说过python,修改过上面

答案 1 :(得分:1)

我假设“unix timestamp formatted date”是指自纪元以来的秒数。这假定文件中的每个数字都是UNIX时间戳。如果不是这种情况,您需要调整正则表达式:

import re, sys

# your convert function goes here

regex = re.compile(r'(\d+)')
for line in sys.stdin:
  sys.stdout.write(regex.sub(lambda m:
  convert(int(m.group(1))), line))

这是从stdin读取并在每个找到的号码上调用convert。

这里的“技巧”是re.sub可以采用从匹配对象转换为字符串的函数。我假设您的转换函数需要一个int并返回一个字符串,所以我使用lambda作为适配器函数来获取匹配的第一组,将其转换为int,然后将结果int传递给转换。

答案 2 :(得分:1)

无法评论您的问题,但您是否看过python的CSV模块? http://docs.python.org/library/csv.html#module-csv

答案 3 :(得分:0)

我会沿着这些方向使用某些东西。很像Laurence的响应,但是你请求了时间戳转换,并将文件名作为参数。此代码假定您正在使用最近的日期(在9/9/2001之后)。如果您需要更早的日期,请降低10到9或更低。

import re, sys, time

regex = re.compile(r'(\d{10,})')

def convert(unixtime):
  return time.strftime("%Y%m%d", time.gmtime(unixtime))

for line in open(sys.argv[1]):
  sys.stdout.write(regex.sub(lambda m: convert(int(m.group(0))), line))

编辑:清理代码。

示例输入

foo,1234567890,bar,1243310263
cat,1243310263,pants,1234567890
baz,987654321,raz,1

<强>输出

foo,20090213,bar,20090526
cat,20090526,pants,20090213
baz,987654321,raz,1 # not converted (too short to be a recent)