Python中的正则表达式替换
我有一个CSV文件有几个条目,每个条目有2个unix时间戳格式化日期。Python中的正则表达式替换
我有一个名为convert()
的方法,它接收时间戳并将其转换为YYYYMMDD
。
现在,由于每行有两个时间戳,我将如何用新值替换每个时间戳?
编辑:只是为了澄清,我想将每个出现的时间戳转换为YYYYMMDD
格式。这是什么在扰乱我,因为re.findall()
返回一个列表。
修改我认为通过“unix时间戳格式化日期”是指从时代开始数秒。这假定文件中的每个数字都是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))
这从标准输入读取和电话转换上找到每个号码。
这里的“诀窍”是re.sub
可以接受一个从匹配对象转换为字符串的函数。我假设你的convert函数需要一个int并返回一个字符串,所以我用lambda作为一个适配器函数来抓取匹配的第一组,并将其转换为int,然后将结果int传递给它。
如果你知道更换:
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有点粗略,希望我说得对。 – 2009-05-26 03:02:29
他说Unix时间戳,应该是类似1243326265(当前时间)。他希望将YYYYMMDD格式作为输出。 – tzot 2009-05-26 08:26:19
我会沿着这些线使用一些东西。很像劳伦斯的回应,但是您需要转换时间戳,并将文件名作为参数。此代码假定您正在使用最近的日期(在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)
谢谢!我还在开始python,这有很大帮助。 – aaront 2009-05-26 03:25:01
我得到一个“没有这样的组”的错误。 – aaront 2009-05-26 03:34:33
嗯......你输入这个错误的输入行是什么样的? (您可能希望在调试时在sys.stdout.write行之后添加一个'sys.stdout.flush()'调用。) – 2009-05-26 03:56:19