Регулярное выражение: добавление кавычек вокруг слов только в фигурных скобках

#python #regex #replace

#python #регулярное выражение #заменить

Вопрос:

Я пытаюсь добавить двойные кавычки вокруг слов только в фигурных скобках.

Ввод:

 {Cat}
{Cow Pig}
{Cat,Dog}
cat dog fish
  

Ожидаемый результат:

 {"Cat"}
{"Cow Pig"}
{"Cat","Dog"}
cat dog fish
  

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

Это то, что я пробовал, что почти работает, но не захватывает группу 2 (слова) отдельно друг от друга.

 ({)([a-zA-z|s|,] ?)(})
Replace with :
{"2"}
  

ДЕМОНСТРАЦИЯ:
https://regex101.com/r/FYBOiO/1

Спасибо!

Ответ №1:

Вы можете сопоставить все строки, в которые хотите заключить слова в двойные кавычки, используя {([ws,] )} регулярное выражение, а затем обернуть слова отдельным символом re.sub :

 import re
r = r'{([ws,] )}'
s = "{Cat}n{Cow Pig}n{Cat,Dog}ncat dog fish"
print( re.sub(r, lambda x: "{{{}}}".format(re.sub(r'w ', r'"g<0>"', x.group(1))), s) )
  

Смотрите демонстрацию Python

Вывод:

 {"Cat"}
{"Cow" "Pig"}
{"Cat","Dog"}
cat dog fish
  

Основным регулярным выражением для извлечения является {([ws,] )} (demo {s*(w (?:s*(?:,s*)?w )*)s*} ), но вы можете уточнить его как (см. Эту демонстрацию регулярных выражений).

Подробные сведения

  • { { символ
  • ([ws,] ) — Группа 1: одно или несколько слов, пробелов или , символов
  • } } символ

Регулярное выражение 2

  • {s* { и 0 пробелов
  • (w (?:s*(?:,s*)?w )*) — Группа 1:
    • w — 1 или более символов word
    • (?:s*(?:,s*)?w )* — 0 или более повторений
      • s* — 0 пробелов
      • (?:,s*)? — необязательная последовательность , и 0 пробелов
      • w — символы 1 word
  • s*} — 0 пробелов и }