Строка Python заменяет символ регулярным выражением [дубликат]
У меня возникла проблема с регулярным выражением, которую я не понимаю. Я пытаюсь заменить запятую между строками на точку с запятой, но это не работает. Вот образец строки ниже. Я установил регулярное выражение для замены всего, кроме содержимого после «последовательности» в группе без захвата регулярного выражения, так что запятую в конце следует заменить единственной подстрокой в группе без захвата, точкой с запятой. Но это не работает. Кажется, что сохраняется какая-либо строка, когда я помещаю (?: Sequence :) в качестве групп без захвата. Как только я добавляю \ d, он заменяет все. Не знаю почему.
В моей реальной проблеме у меня есть ряд тегов содержимого, отмеченных двоеточием и заканчивающихся точкой с запятой. В последовательности тегов вместо точки с запятой стоит ошибочная запятая, которую мне нужно заменить, но все оставить без изменений. Итак, решение должно просто изменить последовательность: 2 на последовательность: 2;
a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(?:sequence\:)(?:\d)(\,)", ";", a_string)
new_string
Я посмотрел на другие решения, которые должны работать, но не для этого. Любая помощь приветствуется, и, пожалуйста, дайте мне знать, если я смогу прояснить этот вопрос.
Ответы
Вы, вероятно, намеревались использовать здесь положительный отрицательный взгляд назад:
a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(?<=\bsequence:\d)(\,)", ";", a_string)
print(new_string)
Это печатает:
tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2; tag4: content4
Кстати, если вы хотите sequenceнапрямую сопоставить текст перед целевой запятой, это нормально, но затем замените его, используя группу захвата:
a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(sequence:\d)(\,)", "\\1;", a_string)
print(new_string) # same as above