Django - 没有按预期替换我的字符串

时间:2017-02-09 04:13:56

标签: python django

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

我正在处理文件。基本上我打开一个文件,阅读其中的内容,找一个单词并替换它旁边的单词

我打开了一个文本文件,在这种情况下,我有两个用同一个名称调用的单词,它们分开为PART 1PART 2

这是我的car.txt

PART 1

car toyota



PART 2

car toyota

正如您所看到的,我为part分隔了相同的单词,因此我的脚本将同时查找并在我的模板中显示此内容。

这是它的工作方式

views.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')

这是我的问题。我想将第1部分从丰田改为现代,并且工作正常。 我得到这样的东西

  

第1部分

     汽车hyundai

     

第2部分

     

汽车丰田

但是如果我想将第2部分从丰田改为现代而未获得第2部分的替换,它将取代我的第1部分..得到这样的东西:

  

第1部分

     汽车hyundai

     

第2部分

     

汽车丰田

我希望第2部分能够使其工作,因为第1部分......我的代码出了什么问题?

这是我的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>
希望你能帮助我。

我会给你很多帮助。

感谢!!!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

如上所述neverwalkaloner,当您将整个文件读入一个字符串filedata时,总是会替换第一个匹配项。如果toyota只出现一次会很好,但会不止一次失败。

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

filedata=filedata.replace(car2 , change_car_2 , 1)更改为filedata=change_car_2.join(filedata.rsplit(car2, 1))