我有一个长字符串,并希望替换此类事件:
'eggs (spam): tomatoes'
与这类:
'eggs : spam tomatoes'
也就是说,如果有'左括号,文本,右括号,双冒号,空格'的模式,那么我希望将其替换为'双冒号,空格,文本'
我尝试过编写以下内容:
import re
re.sub('\(.+\): ', '', 'eggs (spam): tomatoes')
但是(毫不奇怪)它完全删除了括号内的文本,我不知道如何保留以前在函数的'replace'部分括起来的文本。
答案 0 :(得分:1)
您应该使用捕获组:
re.sub(r"\(([^()]*)\)(:)", r"\2 \1", 'eggs (spam): tomatoes')
正则表达式细分:
\(
匹配左括号(
开始捕获第一组
[^()]*
匹配)
结束捕获第一组\)
匹配右括号(:)
捕获冒号(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
答案 3 :(得分:1)
这有效:
>>> re.sub('\((.*)\): ', ': \\1 ', 'eggs (spam): tomatoes')
eggs : spam tomatoes
答案 4 :(得分:1)
您可以使用re.findall
和re.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'