Как найти и заменить текст, в котором есть пробелы перед текстом? - PullRequest
3 голосов
/ 22 января 2012

У меня есть код, который выполняет поиск, если строка начинается с указанного слова, и если это так, он изменяет всю строку с указанным вводом.Тем не менее, это не работает для некоторых строк, если строка с отступом пробелов?Есть ли способ читать текст напрямую и игнорировать пробелы.

Вот код: (с комментариями о том, где проблема)

import os

def template(filein):
    currdir = os.getcwd() # get current directory
    new_file = open(os.path.join(currdir,'maindir','template.in'),'wt')
    old_file = open(filein)
    for line in old_file:
        if line.startswith('   indent'):
            # this part works well because I put the exact number of spaces present in the text before the search word
            new_file.write('   indent == %s \n' % str('%(indent)s'))
        elif line.startswith('noindent'):
            # this part can't find noindent because i didn't specify the spaces before that that is present in the text
            new_file.write('noindent == %s \n' % str('%(noindent)s'))
        else:
            new_file.write(line)
    new_file.close()
    old_file.close()

Спасибо

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

Ответы [ 4 ]

4 голосов
/ 22 января 2012

Вы можете использовать lstrip, чтобы удалить пробел из начала (слева) строки:

for line in old_file:
    stripped_line = line.lstrip()
    # do your matching here against `stripped_line` instead of `line`
    # `line` still contains the original, non-stripped line

В sidenote я рекомендую использовать with open('filename') as new_file вместо того, что вы делаете сейчас. Это создает блок, в котором файл доступен, и гарантирует, что файл закрыт в конце блока. См. Конец этого раздела в документации.

2 голосов
/ 22 января 2012

Я думаю, вы ищете регулярное выражение :

import re

def replace(line, test_word, new_line):
    m = re.match(r'(\s*)(.*)', line)
    if m.group(2).startswith(test_word)
        return m.group(1) + new_line

Пример:

>>> lines = ['    my indented line', 'my not indented line']
>>> for line in lines:
...     replace(line, 'my', 'new line')
'    new line'
'new line'

Вы можете найти в официальной документации о том, как работает group.

0 голосов
/ 22 января 2012

Использовать сопоставление регулярных выражений вместо сопоставления строк:

if re.match('^\s*indent\b', line): 
    # line starts with 0 or more whitespace followed by "indent" 
0 голосов
/ 22 января 2012

Используйте для этого функцию lstrip.

...