我有一个代码,用于搜索一行是否以指定的单词开头,如果是,则会使用指定的输入更改整行。但是,如果行用空格缩进,它对某些行不起作用?有没有办法直接阅读文本并忽略空格。
以下是代码:(注释问题所在的位置)
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()
由于
编辑:我想保留原始文件中的所有空格,即使在我修改过的行中也是如此。
答案 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"