删除文本周围的括号,并在末尾添加冒号

时间:2018-05-24 15:34:47

标签: python regex text

我有一个长字符串,并希望替换此类事件:

'eggs (spam): tomatoes'

与这类:

'eggs : spam tomatoes'

也就是说,如果有'左括号,文本,右括号,双冒号,空格'的模式,那么我希望将其替换为'双冒号,空格,文本'

我尝试过编写以下内容:

import re
re.sub('\(.+\): ', '', 'eggs (spam): tomatoes')

但是(毫不奇怪)它完全删除了括号内的文本,我不知道如何保留以前在函数的'replace'部分括起来的文本。

5 个答案:

答案 0 :(得分:1)

您应该使用捕获组:

re.sub(r"\(([^()]*)\)(:)", r"\2 \1", 'eggs (spam): tomatoes')

Live demo

正则表达式细分:

  • \(匹配左括号
  • (开始捕获第一组
    • [^()]*匹配
    • 之间的任何内容
  • )结束捕获第一组
  • \)匹配右括号
  • (:)捕获冒号(CG#2)

替换字符串"\2 \1"表示替换应该遵循第二个捕获组数据,然后是一个空格,然后首先捕获组数据。

答案 1 :(得分:1)

使用re.sub('\((.*?)\): ', r':\1 ', 'eggs (spam): tomatoes')

<强>演示:

import re
print(re.sub('\((.*?)\): ', r':\1 ', 'eggs (spam): tomatoes'))

<强>输出:

eggs :spam tomatoes

答案 2 :(得分:1)

在您的代码中,您要从左括号中选择,直到包含冒号的右括号,并用空字符串替换它。这就是它完全删除括号内文本的原因。

您可以使用2个捕获组并替换为组2组1:

\((.+?)\)(:)

  • \(按字面意思匹配
  • (.+?)在第1组中捕获\\1任何字符一次或多次非贪婪
  • \)按字面意思匹配
  • (:)在第2组\\2
  • 中捕获冒号

例如:

import re
print(re.sub(r"\((.+?)\)(:)", "\\2 \\1", 'eggs (spam): tomatoes'))

那会给你:

eggs : spam tomatoes

Demo

答案 3 :(得分:1)

这有效:

>>> re.sub('\((.*)\): ', ': \\1 ', 'eggs (spam): tomatoes')
eggs : spam tomatoes

答案 4 :(得分:1)

您可以使用re.findallre.sub

import re
s = 'eggs (spam): tomatoes'
new_s = re.sub('\(\w+\):', '{}', s).format(*[f': {i}' for i in re.findall('\((.*?)\)', s)])

输出:

'eggs : spam tomatoes'