Подстановка регулярных выражений в Python - PullRequest
2 голосов
/ 26 мая 2009

У меня есть файл CSV с несколькими записями, и у каждой записи есть 2 даты в формате Unix, отформатированные с отметкой времени.

У меня есть метод с именем convert(), который берет метку времени и преобразует ее в YYYYMMDD.

Теперь, так как у меня есть 2 метки времени в каждой строке, как бы я заменил каждую из них новым значением?

РЕДАКТИРОВАТЬ: Просто чтобы уточнить, я хотел бы преобразовать каждое вхождение отметки времени в формат YYYYMMDD. Это то, что меня беспокоит, так как re.findall() возвращает список.

Ответы [ 4 ]

3 голосов
/ 26 мая 2009

Если вам известна замена:

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 голос
/ 26 мая 2009

Не можете прокомментировать ваш вопрос, но вы взглянули на CSV-модуль Python? http://docs.python.org/library/csv.html#module-csv

1 голос
/ 26 мая 2009

Я предполагаю, что под "датой форматирования метки времени 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 и возвращает строку, поэтому я использовал лямбда-функцию в качестве функции адаптера, чтобы получить первую группу совпадения, преобразовать ее в int, а затем передать полученное int для преобразования.

0 голосов
/ 26 мая 2009

Я бы использовал что-то подобное. Очень похоже на ответ Лоуренса, но с преобразованием метки времени, которое вы запросили, и принимает имя файла в качестве параметра. Этот код предполагает, что вы работаете с последними датами (после 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...