Регулярное выражение для двух цифр и дефис

У меня очень длинный текстовый файл в результате теста прошлой ночью. Глупо, я забыл правильно отформатировать его с помощью "\n". Образец:

"01-someText151645.txt,Wed Feb 1 16:15:18 2012,1328112918.57801-HalfMeg151646.txt,Wed Feb 1 16:15:18 2012,1328112918.578"... on and on.

Как вы можете видеть, нет промежутка между концом временной метки эпохи и именем текстового файла. К счастью, каждый текстовый файл начинается с двух цифр и дефиса. Таким образом, приведенный выше пример должен выглядеть так:

01-someText151645.txt,Wed Feb 1 16:15:18 2012,1328112918.578
01-someText151646.txt,Wed Feb 1 16:15:18 2012,1328112918.578

К сожалению, предыдущий проект, в котором у меня было много парсинга Regex, не под рукой, и поэтому вам нужно немного помочь получить регулярное выражение для этого. Мой план состоит в том, чтобы затем использовать re.findall(regex, sample) чтобы получить нужную мне информацию.

Изменение: просто для того, чтобы явно сказать, что каждая строка имеет текстовое имя файла, дату и временную метку времени, все разделенные "," (без пробелов). Каждый файл начинается с двух цифр и дефиса. Итак, это: textfile,date,epoch, textfile = digit,digit,-

3 ответа

Вот то, что я бросил вместе, манипулировать им в соответствии:

import re

m = """01-someText151645.txt,Wed Feb 1 16:15:18 2012,1328112918.57801-HalfMeg151646.txt,Wed Feb 1 16:15:18 2012,1328112918.578"""

print(m)

addNewLineBefore = lambda matchObject: "\n" + matchObject.group(0)

print ( re.sub(r'\d{2}-',addNewLineBefore,m) )

Разумеется, предполагается, что совпадение \d{2}- уникально для начала строки. Если есть вероятность, что они появляются в строке, например, в имени файла, укажите это, и я отредактирую этот ответ, чтобы разместить

EDIT: Если вы не хотите читать весь файл в памяти, вы можете использовать буфер:

import re
input = open("infile","r")
output = open("outfile","w")

oneLine = re.compile(r"""(
 \d{2}- # the beginning of the line
 .+? # the middle of the line
 \.\d{3} # the dot and three digits at the end
)""", re.X)

while buffer:
 buffer = input.read(6000) # adjust this to suit
 #newbuffer = re.split(r'(\d{2}-.+?\.\d{3})',buffer) # I'll use the commented re object above
 newbuffer = oneLine.split(buffer)
 newbuffer = filter(None,newbuffer)
 output.write( "\n".join(newbuffer) )
input.close()
output.close()

Это не должно использоваться, если проверка ошибок и эффективность являются необходимыми. Насколько я понимаю, это очень контролируемая и неформальная среда


Здесь попробуйте следующее:

([0-9]{2}-[a-zA-Z]{5,}[0-9]{5,}\.txt){1,}

Это будет соответствовать (тесно, но свободно) формату вашего имени файла. Вы можете приспособиться к вашим потребностям.

Разделите это, а затем отделите файл соответствующим образом.


Если ваш файл достаточно мал, чтобы его можно было сразу считывать в память, вы могли бы просто разбить его на регулярное выражение

re.split('(?=\d\d-)', contents)

или вставить новые строки, где они принадлежат

re.sub('(?=\d\d-)', "\n", contents)

licensed under cc by-sa 3.0 with attribution.