在Python中进行正则替换

2 投票
4 回答
1757 浏览
提问于 2025-04-15 11:49

我有一个CSV文件,里面有很多条记录,每条记录都有两个以Unix时间戳格式表示的日期。

我有一个叫做 convert() 的方法,它可以把时间戳转换成 YYYYMMDD 的格式。

现在,因为每一行都有两个时间戳,我该怎么把这两个时间戳都替换成新的值呢?

补充说明:我想把每个时间戳都转换成 YYYYMMDD 格式。这让我很困扰,因为 re.findall() 返回的是一个列表。

4 个回答

1

我不能评论你的问题,不过你有没有看看Python的CSV模块?这个模块可以帮助你处理CSV文件。你可以在这里找到相关的文档:http://docs.python.org/library/csv.html#module-csv

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

我猜你说的“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 可以接受一个函数,这个函数可以把匹配到的对象转换成字符串。我假设你的转换函数需要一个整数并返回一个字符串,所以我用了一个lambda表达式作为适配器函数,来提取匹配结果的第一个组,把它转换成整数,然后把这个整数传给转换函数。

撰写回答