Python Django-未按预期替换我的字符串

Python Django-未按预期替换我的字符串,python,django,Python,Django,我需要帮助,我不知道如何解决它 我在处理文件。基本上,我打开一个文件,阅读里面的内容,查找一个单词,然后替换旁边的单词 我正在打开一个文本文件,在本例中,我有两个同名的单词,它们分别为第1部分和第2部分 这是我的车。txt PART 1 car toyota PART 2 car toyota 正如您所看到的,我的部分使用了相同的单词,因此我的脚本将查找这两个单词,并在我的模板中显示这两个单词 这就是它的工作原理 视图.py def car_p1(): file = open

我需要帮助,我不知道如何解决它

我在处理文件。基本上,我打开一个文件,阅读里面的内容,查找一个单词,然后替换旁边的单词

我正在打开一个文本文件,在本例中,我有两个同名的单词,它们分别为
第1部分
第2部分

这是我的车。txt

PART 1

car toyota



PART 2

car toyota
正如您所看到的,我的
部分使用了相同的单词,因此我的脚本将查找这两个单词,并在我的模板中显示这两个单词

这就是它的工作原理

视图.py

def car_p1():
    file = open("car.txt","r")
    content = file.read()
    file.close()
    car = re.findall('car\s(.*?)\s',open('car.txt','r').read())
    if car:
        print car
    else:
        print 'no car found!'
    return car[0]


def car_p2():
    file = open("car.txt","r")
    content = file.read()
    file.close()
    car = re.findall('car\s(.*?)\s',open('car.txt','r').read())
    if car:
        print car
    else:
        print 'no car found!'
    return car[1]


def get_items(request):
    car = car_p1()
    car2 = car_p2()
    if 'car' in request.POST:
        car_change(request)
        return redirect('get_items')
    return render(request, 'cars.html', {'car':car, 'car2':car2,})

def car_change(request):
    car = car_p1()
    car2 = car_p2()
    if request.method == 'POST':
        change_car = str(request.POST['car_1'])
        change_car_2 = str(request.POST['car_2'])
        filedata= None
        with open('car.txt', 'r') as f:
            filedata = f.read()
            filedata=filedata.replace(car , change_car , 1)
            filedata=filedata.replace(car2 , change_car_2 , 1)
            with open('car.txt', 'wb') as f:
                f.writelines(filedata)
    return render(request, 'cars.html')
这是我的问题。我想把第一部分从丰田换成现代,效果还可以。 我得到了这样的东西

第一部分

现代汽车

第二部分

丰田汽车

但是如果我想把第二部分从丰田换成现代,第二部分就不会被替换,它会替换我的第一部分。。得到这样的东西:

def replace_second_car(filedata, old_car, new_car):
     places = [i.start() for i in re.finditer('car\s(.*?)\s',filedata)]
     start_place = places[1]
     return filedata[:start_place] + filedata[start_place:].replace(old_car, new_car)
filedata = replace_second_car(filedata, car2, change_car_2)
第一部分

现代汽车

第二部分

丰田汽车

我想让第二部分像第一部分一样工作。。。我的代码怎么了

这是我的html:

<form method="post" class="" action="">{% csrf_token %}
    <label for="car1">CAR 1: </label>
    <input id="car1" class="form-control" type="text" name="car_1" value="{{ car }}">
    <br>
    <label for="car2">CAR 2: </label>
    <input id="car2" class="form-control" type="text" name="car_2" value="{{ car2 }}">
    <br>
    <br>
    <input type="submit" name="car" class="btn btn-primary btn-lg btn-block" value="Save">
</form>
{%csrf\u令牌%}
第一辆车:

第二辆车:

希望你能帮助我

我将非常感谢你的帮助


谢谢

问题是
replace
将只替换字符串中的前N个匹配项。如果需要替换第二个引用,可以实现自定义方法,如下所示:

def replace_second_car(filedata, old_car, new_car):
     places = [i.start() for i in re.finditer('car\s(.*?)\s',filedata)]
     start_place = places[1]
     return filedata[:start_place] + filedata[start_place:].replace(old_car, new_car)
filedata = replace_second_car(filedata, car2, change_car_2)
现在,在视图中,您可以这样使用它:

def replace_second_car(filedata, old_car, new_car):
     places = [i.start() for i in re.finditer('car\s(.*?)\s',filedata)]
     start_place = places[1]
     return filedata[:start_place] + filedata[start_place:].replace(old_car, new_car)
filedata = replace_second_car(filedata, car2, change_car_2)

问题是
replace
将只替换字符串中的前N个匹配项。如果需要替换第二个引用,可以实现自定义方法,如下所示:

def replace_second_car(filedata, old_car, new_car):
     places = [i.start() for i in re.finditer('car\s(.*?)\s',filedata)]
     start_place = places[1]
     return filedata[:start_place] + filedata[start_place:].replace(old_car, new_car)
filedata = replace_second_car(filedata, car2, change_car_2)
现在,在视图中,您可以这样使用它:

def replace_second_car(filedata, old_car, new_car):
     places = [i.start() for i in re.finditer('car\s(.*?)\s',filedata)]
     start_place = places[1]
     return filedata[:start_place] + filedata[start_place:].replace(old_car, new_car)
filedata = replace_second_car(filedata, car2, change_car_2)
如前所述,当您将整个文件读入一个字符串
filedata
时,始终替换第一个匹配项。如果
toyota
只出现一次就可以了,但如果出现多次就会失败

您可以从右到左替换car2的
filedata
字符串

更改
filedata=filedata.replace(car2,Change\u car\u 2,1)
filedata=Change\u car\u 2.join(filedata.rsplit(car2,1))
如上所述,当您将整个文件读入一个字符串
filedata
时,始终替换第一个匹配项。如果
toyota
只出现一次就可以了,但如果出现多次就会失败

您可以从右到左替换car2的
filedata
字符串


更改
filedata=filedata.replace(car2,Change\u car\u 2,1)
filedata=Change\u car\u 2.join(filedata.rsplit(car2,1))

OP返回car\u p2()中的car[1],因此只出现一次。OP的替换功能有效properly@HaifengZhangOP初始文件包括两个相同的行:
cartoyota
。他试着只更换了第二辆车。汽车p1()在零件1区域返回丰田,汽车p2()在零件2区域返回丰田area@HaifengZhang这是真的,但当他真的“替换”(car2,“honda”)时,这只替换了第一辆丰田。因为car=car2='toyota'.didnotcie OP将整个文件读取为一个字符串,+1 for youOP返回car_p2()中的car[1],因此只出现一次。OP的替换功能有效properly@HaifengZhangOP初始文件包括两个相同的行:
cartoyota
。他试着只更换了第二辆车。汽车p1()在零件1区域返回丰田,汽车p2()在零件2区域返回丰田area@HaifengZhang这是真的,但当他真的“替换”(car2,“honda”)时,这只替换了第一辆丰田。因为car=car2='toyota'。我没有把整个文件读成一个字符串,+1代表你