2009-09-14 4 views
2

У меня есть CSV-подобный текстовый файл, который имеет около 1000 строк. Между каждой записью в файле находится длинная серия тире. Записи обычно заканчиваются символом \ n, но иногда перед \ n до конца записи появляется дополнительный \ n. Упрощенный пример:Отрицательный взгляд после новой строки?

"1x", "1y", "Hi there" 
------------------------------- 
"2x", "2y", "Hello - I'm lost" 
------------------------------- 
"3x", "3y", "How ya 
doing?" 
------------------------------- 

Я хочу, чтобы заменить дополнительный \ п с пробелами, т.е. конкатенации строк между штрихами. Я думал, что я мог бы сделать это (Python 2.5):

text = open("thefile.txt", "r").read()  
better_text = re.sub(r'\n(?!\-)', ' ', text) 

, но это, кажется, заменить все \ п, а не только те, которые не следует тир. Что я делаю не так?

Я задаю этот вопрос, пытаясь улучшить свои собственные навыки регулярного выражения и понять ошибки, которые я совершил. Конечная цель состоит в том, чтобы сгенерировать текстовый файл в формате, который можно использовать с помощью специального макроса VBA для Word, который генерирует документ Word в стиле, который затем будет перевариваться с помощью Word-friendly CMS.

+0

Если бы это был Perl, я бы сказал, что set '$ /' to ''------------------------------- ' –

ответ

5

Вам необходимо исключить разрывы строк в конце разделительных линий. Попробуйте это:

\n(?<!-\n)(?!-) 

Это регулярное выражение использует отрицательное look-behind assertion исключить \n, который предваряется в -.

+0

Спасибо, теперь я вижу. Я не смог полностью определить проблему, прежде чем пытаться решить проблему, а затем смутил вещи, предположив, что я заменяю все \ n, когда фактически заменяю только половину. – fwkb

1
re.sub(r'(?<!-)\n(?!-)', ' ', text) 

(дефис не нужно выходить наружу из класса символов.)

+0

... и вне объявления диапазона символов и в начале или конце класса claracter. '[a-z-0-9]', '[-a-z]' и '[a-z-]' - все допустимые объявления классов символов. – Gumbo

7

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

def readCleanLines(someFile): 
    for line in someFile: 
     if line.strip() == len(line.strip())*'-': 
      continue 
     yield line 

reader= csv.reader(readCleanLines(someFile)) 
for row in reader: 
    print row 

Это должно обрабатывать разрывы строк внутри кавычек без помех и молча.


Если вы хотите, чтобы делать другие вещи, с этим файлом, например, сохранить копию с строки будут удалены, вы можете сделать это.

with open("source", "r") as someFile: 
    with open("destination", "w") as anotherFile: 
     for line in readCleanLines(someFile): 
      anotherFile.write(line) 

Это сделает копию с строки будут удалены. Это не стоит усилий, так как чтение и пропуски линий очень, очень быстро и не требуют дополнительного хранения.

+1

Удивительная идея разделить линии с генератором! – orip

+0

BTW - вам не нужно len (line.strip()) вместо len (line)? – orip

+0

@orip: Это было бы ошибкой, спасибо. –

0

RegEx - не всегда лучший инструмент для работы. Как пропустить его через что-то вроде «Split» или «Tokenize»? (Я уверен, что у python есть эквивалент). Тогда у вас есть свои записи и вы можете считать, что строки новой строки - это просто продолжения.

Смежные вопросы