Как сопоставить и заменить этот шаблон в Python RE? - PullRequest
0 голосов
/ 24 июня 2019
s = "[abc]abx[abc]b" 

s = re.sub("\[([^\]]*)\]a", "ABC", s) 

'ABCbx[abc]b' 

В строке s я хочу сопоставить 'abc', когда оно заключено в [], после которого следует 'a'. Таким образом, в этой строке первый [abc] будет заменен, а второй нет.

Я написал шаблон выше, он соответствует:

match anything starting with a '[', followed by any number of characters which is not ']', then followed by the character 'a'. 

Однако в замене я хочу, чтобы строка была такой:

[ABC]abx[abc]b . // NOT ABCbx[abc]b

А именно, я не хочу заменять весь подобранный шаблон, а только что-нибудь со скобкой []. Как этого добиться?

match.group (1) вернет содержимое в []. Но как воспользоваться этим в re.sub?

Ответы [ 3 ]

3 голосов
/ 24 июня 2019

Почему бы просто не включить [ и ] в замену?

s = re.sub("\[([^\]]*)\]a", "[ABC]a", s) 
1 голос
/ 24 июня 2019

Существует более 1 метода, один из которых использует groups.

import re
s = "[abc]abx[abc]b"
out = re.sub('(\[)([^\]]*)(\]a)', r'\1ABC\3', s)
print(out)

Вывод:

[ABC]abx[abc]b

Обратите внимание, что есть 3 группы (заключенные в скобки)в первом аргументе re.sub, затем я ссылаюсь на 1-й и 3-й (индексация примечания начинается с 1), поэтому они остаются неизменными, вместо 2-й группы, которую я поставил ABC.Второй аргумент re.sub является необработанной строкой, поэтому мне не нужно экранировать \.

0 голосов
/ 24 июня 2019

Это регулярное выражение использует обходные пути для утверждений префикса / суффикса, так что сам текст совпадения имеет только «abc»:

(?<=\[)[^]]*(?=\]a)

Пример: https://regex101.com/r/NDlhZf/1

Так что это:

  1. (?<=\[) - позитивный взгляд, утверждающий, что литерал [ находится непосредственно перед началом матча
  2. [^]]* - любое число не ]символы (фактическое совпадение)
  3. (?=\]a) - положительный прогноз, утверждая, что текст ]a непосредственно следует за текстом совпадения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...