Как подставить в группу регулярных выражений в Python - PullRequest
7 голосов
/ 17 июня 2010
>>> s = 'foo: "apples", bar: "oranges"'
>>> pattern = 'foo: "(.*)"'

Я хочу иметь возможность подставить в группу вот так:

>>> re.sub(pattern, 'pears', s, group=1)
'foo: "pears", bar: "oranges"'

Есть ли хороший способ сделать это?

Ответы [ 2 ]

10 голосов
/ 17 июня 2010

У меня работает что-то вроде:

rx = re.compile(r'(foo: ")(.*?)(".*)')
s_new = rx.sub(r'\g<1>pears\g<3>', s)
print(s_new)

Обратите внимание ? на re, поэтому оно заканчивается первым ", также обратите внимание на " в группах 1 и 3, потому что они должны быть на выходе.

Вместо \g<1> (или \g<number>) вы можете использовать просто \1, но не забывайте использовать «сырые» строки, и форма g<1> предпочтительнее, поскольку \1 может быть неоднозначным (примеры приведены в Python doc ).

0 голосов
/ 17 июня 2010
re.sub(r'(?<=foo: ")[^"]+(?=")', 'pears', s)

Регулярное выражение соответствует последовательности символов, которая

  • следует за строкой foo: ",
  • , не содержит двойных кавычек и
  • сопровождается "

(?<=) и (?=) lookbehind и lookahead

Это регулярное выражение завершится ошибкой, если значение foo содержитсбежавшие цитаты.Используйте следующий, чтобы поймать их тоже:

re.sub(r'(?<=foo: ")(\\"|[^"])+(?=")', 'pears', s)

Пример кода

>>> s = 'foo: "apples \\\"and\\\" more apples", bar: "oranges"'
>>> print s
foo: "apples \"and\" more apples", bar: "oranges"
>>> print   re.sub(r'(?<=foo: ")(\\"|[^"])+(?=")', 'pears', s)
foo: "pears", bar: "oranges"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...