Найти и заменить регулярное выражение после манипулирования им? - PullRequest
0 голосов
/ 10 декабря 2018

Что я хочу сделать, это (в псевдокоде):

search for [[phrase//<img src="example.jpg" />//description (if applicable)]]
replace with:
<a>phrase
<div>Description<br><img src="example.jpg"></div>
</a>

Например, я хочу преобразовать это:

[[transvaginal pudendal nerve block//<img src="3bc9e18a9fa82a1bd4e0c8c580909389.jpg" />//image of transvaginal pudendal nerve block]]

В это:

<a>transvaginal pudendal nerve block
<div>image of transvaginal pudendal nerve block<br><img src="3bc9e18a9fa82a1bd4e0c8c580909389.jpg" /></div>
</a>

Вот мой код:

import re

answer_string = open("answer.txt", "r").read()
pattern = re.compile(r"\[\[.*\]\]")

for raw_material in re.findall(pattern, answer_string):
    copy_material = raw_material
    copy_material = copy_material.replace("[[", "")
    copy_material = copy_material.replace("]]", "")
    copy_material = copy_material.split("//")

    if len(copy_material) >= 3:
        raw_material = "<a>" + copy_material[0] + "<div>" + copy_material[2] + "<br>" + copy_material[1] + "</div></a>"
    else:
        raw_material = "<a>" + copy_material[0] + "<div>" + copy_material[1] + "</div></a>"

with open('new_answer.txt','w') as f:
  f.write(answer_string)
  f.close()

Я думал, что установив raw_material =, я смогу мгновенно изменить фразу, но я не думаю.В некотором замешательстве то, как я могу найти что-то с помощью регулярных выражений, манипулировать этим, а затем заменить фразу.

1 Ответ

0 голосов
/ 10 декабря 2018

На самом деле вы можете использовать re.sub для замены совпадений, и вы можете вызвать небольшую функцию, если ваша строка замены может отличаться в разных случаях.Например:

def replace_string(matchobj):
    if len(matchobj.groups()) == 5:
        if matchobj.group(5):
            return "<a>"+matchobj.group(2)+"\n<div>"+matchobj.group(5)+"<br>"+matchobj.group(3)+"</div></a>"
        else: 
            return "<a>"+matchobj.group(2)+"\n<div><br>"+matchobj.group(3)+"</div></a>"
    else:
        return ""

pattern = re.compile(r"\[\[((.*?)//)(.*?)(//(.*?))*\]\]")

print re.sub(pattern, replace_string, answer_string)

Теперь это быстро и грязно, но идея в том, что re.sub найдет и заменит все совпадения.Я изменил шаблон, чтобы добавить круглые скобки, которые заставляют Python 'захватывать' совпадения в groups() объекта сопоставления.Таким образом, на основе добавленной скобки, есть 5 групп захвата.Я думаю, что будет 5 групп захвата каждый раз, когда это выражение совпадает, но если что-то не совпадает, захваченная группа будет None.

Когда происходит замена, она вызывает функцию replace_string,и код решает, что возвращать, основываясь на том, является ли 5-я группа None.Это случится, если пропустить часть //description.Я не уверен, если проверка для 5 групп необходима, но хотел быть уверен.

В любом случае, я думаю, это должно, по крайней мере, указать вам полезное направление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...