Негативный взгляд после новой строки? - PullRequest
2 голосов
/ 14 сентября 2009

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

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

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 14 сентября 2009

Это хорошее место, чтобы использовать функцию генератора, чтобы пропустить строки ---- и получить то, что может прочитать модуль 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 )

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

5 голосов
/ 14 сентября 2009

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

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

В этом регулярном выражении используется отрицательное проверочное утверждение для исключения \n, которому предшествует -.

1 голос
/ 14 сентября 2009
re.sub(r'(?<!-)\n(?!-)', ' ', text)

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

0 голосов
/ 14 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...