Строка Python заменяет символ регулярным выражением [дубликат]

Nov 27 2020

У меня возникла проблема с регулярным выражением, которую я не понимаю. Я пытаюсь заменить запятую между строками на точку с запятой, но это не работает. Вот образец строки ниже. Я установил регулярное выражение для замены всего, кроме содержимого после «последовательности» в группе без захвата регулярного выражения, так что запятую в конце следует заменить единственной подстрокой в ​​группе без захвата, точкой с запятой. Но это не работает. Кажется, что сохраняется какая-либо строка, когда я помещаю (?: 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

Я посмотрел на другие решения, которые должны работать, но не для этого. Любая помощь приветствуется, и, пожалуйста, дайте мне знать, если я смогу прояснить этот вопрос.

Ответы

1 TimBiegeleisen Nov 27 2020 at 06:17

Вы, вероятно, намеревались использовать здесь положительный отрицательный взгляд назад:

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