Python 搜索并替换特定行下的字符串

Python 搜索并替换特定行下的字符串,python,replace,find,Python,Replace,Find,如何进行搜索并替换字符串。更具体地说 我有一个文本文件 SAMPLE AB CD .. TYPES AB QP PO .. RUNS AB DE ZY 我想将AB替换为XX,仅在SAMPLE和RUNS行下。我已经尝试了多种使用replace()的方法。我试过类似的东西 if 'SAMPLE' in line: f1.write(line.replace('testsample', 'XX')) if 'RUNS' in line:

如何进行搜索并替换字符串。更具体地说

我有一个文本文件

SAMPLE  
AB  
CD  
..  
TYPES  
AB  
QP  
PO  
..  
RUNS  
AB  
DE  
ZY 
我想将
AB
替换为
XX
,仅在
SAMPLE
RUNS
行下。我已经尝试了多种使用
replace()
的方法。我试过类似的东西

if 'SAMPLE' in line:
    f1.write(line.replace('testsample', 'XX'))
if 'RUNS' in line:
    f1.write(line.replace('testsample', 'XX'))

这不起作用。

最简单的方法是逐行迭代文件,每次看到
示例或
运行
行以保存标志,意思是“前一行是我正在查找的”。任何其他行都将重置此标志。现在,在每次迭代中,您都要检查标志是否是在上一次迭代中设置的,如果是,您需要执行
.replace
操作。

最简单的方法是逐行迭代您的文件,每次看到
示例或
运行
行以保存标志,意思是“上一行是我正在查找的”. 任何其他行都将重置此标志。现在,在每次迭代中,您都要检查标志是否是在上一次迭代中设置的,如果是,则执行
.replace
操作。

文件是Python中行的迭代器:

for line in file:
    output.write(line) # save as is
    if 'SAMPLE' in line or 'RUNS' in line:
       line = next(file, "") # move to the next line
       output.write(line.replace('AB', 'XX')) # save replacing AB with XX
支持紧跟另一个采样/运行行的采样/运行行,例如:

SAMPLE
SAMPLE
AB
你可以:

for line in file:
    output.write(line) # save as is
    while 'SAMPLE' in line or 'RUNS' in line:
       line = next(file, "") # move to the next line
       output.write(line.replace('AB', 'XX')) # save replacing AB with XX

文件是Python中行的迭代器:

for line in file:
    output.write(line) # save as is
    if 'SAMPLE' in line or 'RUNS' in line:
       line = next(file, "") # move to the next line
       output.write(line.replace('AB', 'XX')) # save replacing AB with XX
支持紧跟另一个采样/运行行的采样/运行行,例如:

SAMPLE
SAMPLE
AB
你可以:

for line in file:
    output.write(line) # save as is
    while 'SAMPLE' in line or 'RUNS' in line:
       line = next(file, "") # move to the next line
       output.write(line.replace('AB', 'XX')) # save replacing AB with XX

假设您不希望替换
示例
下面的行,也不希望替换包含
ABC
的行,那么如果您的文件每行包含的文本比您要查找的字符串多,那么这将更加健壮

valid_sections = set(('RUNS', 'SAMPLE'))
for raw_line in fobj_in:
    clean_line = raw_line.strip()
    if clean_line in valid_sections:
        fobj_out.write(raw_line)
        raw_line = next(fobj_in)
        clean_line = raw_line.strip()
        if clean_line == 'AB':
            fobj_out.write(raw_line.replace('AB', 'XX'))
        else:
            fobj_out.write(raw_line)
    else:
        fobj_out.write(raw_line)

假设您不希望替换
示例
下面的行,也不希望替换包含
ABC
的行,那么如果您的文件每行包含的文本比您要查找的字符串多,那么这将更加健壮

valid_sections = set(('RUNS', 'SAMPLE'))
for raw_line in fobj_in:
    clean_line = raw_line.strip()
    if clean_line in valid_sections:
        fobj_out.write(raw_line)
        raw_line = next(fobj_in)
        clean_line = raw_line.strip()
        if clean_line == 'AB':
            fobj_out.write(raw_line.replace('AB', 'XX'))
        else:
            fobj_out.write(raw_line)
    else:
        fobj_out.write(raw_line)


您应该明白,即使AB是行的一部分(CRAB->CRXX),这也会将“AB”替换为“XX”。@oleg:是的。你看到问题中的任何迹象表明它应该是另一种情况吗?没有,但任务表述对我来说似乎模棱两可。我决定提请大家注意这一点。此外,如果
SAMPLE
是文件的最后一行,则此代码将引发一个异常。@kirelagin:我添加了处理位于最后一行的示例的代码。您应该理解,即使AB是行的一部分,这也会将“AB”替换为“XX”。@oleg:是的。你看到问题中的任何迹象表明它应该是另一种情况吗?没有,但任务表述对我来说似乎模棱两可。我决定提请大家注意这一方面。而且,如果
SAMPLE
是文件的最后一行,则此代码将引发异常。@kirelagin:我已添加代码,用于处理有效\u节中最后一行
clean\u中的SAMPLE,并且clean\u line==“AB”
对于任何输入,在代码中始终是
False
。感谢您的指针。修正了。需要转到下一行以搜索
AB
。您需要重新添加剥离的换行符。我只写
原始行
,即非剥离行。
clean_行
并非仅用于检查。
clean_行在有效部分和clean_行==“AB”
对于任何输入,在代码中总是
False
。感谢您的指针。修正了。需要转到下一行以搜索
AB
。您需要重新添加剥离的换行符。我只写
原始行
,即非剥离行。
clean_行
并非仅用于检查。