正则表达式:仅在大括号内在单词周围添加引号

时间:2019-04-12 08:47:52

标签: python regex replace

我试图仅在大括号内在单词周围添加双引号。

输入:

{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 个答案:

答案 0 :(得分:1)

您可以使用{([\w\s,]+)}正则表达式将所有要用双引号引起来的单词与所有字符串匹配,然后用单独的re.sub来引起单词:

import re
r = r'{([\w\s,]+)}'
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 demo

输出:

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

主要提取正则表达式为{([\w\s,]+)}demo),但您可以将其精确表示为{\s*(\w+(?:\s*(?:,\s*)?\w+)*)\s*}(请参见this regex demo)。

详细信息

  • {-一个{字符
  • ([\w\s,]+)-第1组:一个或多个单词,空格或,字符
  • }-一个}字符

正则表达式2

  • {\s*-{和0+空格
  • (\w+(?:\s*(?:,\s*)?\w+)*)-第1组:
    • \w+-1个或多个单词字符
    • (?:\s*(?:,\s*)?\w+)*-重复0次或更多次
      • \s*-超过0个空格
      • (?:,\s*)?-,和0+空格的可选序列
      • \w+-1个以上的字符字符
  • \s*}-0 +空格和}