如何搜索和替换文本前面有空格的文本?

时间:2012-01-22 12:35:16

标签: python search replace spaces

我有一个代码,用于搜索一行是否以指定的单词开头,如果是,则会使用指定的输入更改整行。但是,如果行用空格缩进,它对某些行不起作用?有没有办法直接阅读文本并忽略空格。

以下是代码:(注释问题所在的位置)

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 个答案:

答案 0 :(得分:4)

您可以使用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

在旁注中,我建议使用with open('filename') as new_file,而不是现在正在做的事情。这将创建一个文件可用的块,并确保文件在块结束时关闭。请参阅文档中this section的末尾。

答案 1 :(得分:2)

我认为您正在寻找regular expression

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'

您可以在官方文档some examples中找到group的工作原理。

答案 2 :(得分:0)

使用lstrip功能执行此操作。

答案 3 :(得分:0)

使用正则表达式匹配而不是字符串匹配:

if re.match('^\s*indent\b', line): 
    # line starts with 0 or more whitespace followed by "indent"