我需要用{
,}
替换两个字符{\n
,\n}
。
但是它们一定不能被''
或""
包围。
我尝试使用此代码来实现这一目标
text = 'hello(){imagine{myString("HELLO, {WORLD}!")}}'
replaced = re.sub(r'{', "{\n", text)
Ellipsis...
自然地,此代码替换了用引号引起来的大括号。
可以在正则表达式中使用的!
或not
这样的否定语句是什么?
以下是我想要的。
hello(){
imagine{
puts("{HELLO}")
}
}
简而言之-我要做的是
{
和}
。''
或""
中{
或}
替换为{\n
或\n}
相反,我可以用(?P<a>\".*){(?P<b>.*?\")
解决。
但是我不知道如何解决我的情况。
答案 0 :(得分:1)
首先用{
替换所有{\n
个字符。您还将用{"
替换{\n"
。现在,您可以将所有{\n"
个字符替换为{"
。
text = 'hello(){imagine{puts("{HELLO}")}}'
replaced = text.replace('{', '{\n').replace('{\n"','{"')
答案 1 :(得分:1)
您可以匹配单引号和双引号(C样式)字符串文字(那些支持带有反斜杠的转义实体的文字),然后在可以用您替换的其他任何上下文中匹配{
和}
期望值。
请参见Python demo:
import re
text = 'hello(){imagine{puts("{HELLO}")}}'
dblq = r'(?<!\\)(?:\\{2})*"[^"\\]*(?:\\.[^"\\]*)*"'
snlq = r"(?<!\\)(?:\\{2})*'[^'\\]*(?:\\.[^'\\]*)*'"
rx = re.compile(r'({}|{})|[{{}}]'.format(dblq, snlq))
print(rx.pattern)
def repl(m):
if m.group(1):
return m.group(1)
elif m.group() == '{':
return '{\n'
else:
return '\n}'
# Examples
print(rx.sub(repl, text))
print(rx.sub(repl, r'hello(){imagine{puts("Nice, Mr. \"Know-all\"")}}'))
print(rx.sub(repl, "hello(){imagine{puts('MORE {HELLO} HERE ')}}"))
上面的代码中生成的模式是
((?<!\\)(?:\\{2})*"[^"\\]*(?:\\.[^"\\]*)*"|(?<!\\)(?:\\{2})*'[^'\\]*(?:\\.[^'\\]*)*')|[{}]
实际上可以减少为
(?<!\\)((?:\\{2})*(?:"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'))|[{}]
请参见regex demo。
详细信息:
该模式与2个主要替代项匹配。第一个匹配单引号和双引号的字符串文字。
(?<!\\)
-不允许紧接左侧的\
((?:\\{2})*(?:"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'))
-第1组:
(?:\\{2})*
-两个连续的反斜杠的重复次数为0 + (?:
-非捕获组:
"[^"\\]*(?:\\.[^"\\]*)*"
-双引号字符串文字|
-或'[^'\\]*(?:\\.[^'\\]*)*'
-单引号字符串文字)
-非捕获组的结尾|
-或
[{}]
-一个{
或}
。在repl
方法中,检查组1是否匹配。如果匹配,则匹配单引号或双引号的字符串文字,必须将其放回原处。否则,如果匹配值是{
,则将其替换为{\n
,否则将替换为\n}
。
答案 2 :(得分:0)
您可以检查输入的相似性,然后尝试匹配它们。
text = 'hello(){imagine{puts("{HELLO}")}}'
replaced = text.replace('){', '){\n').replace('{puts', '{\nputs').replace('}}', '\n}\n}')
print(replaced)
输出:
hello(){
imagine{
puts("{HELLO}")
}
}
更新
答案 3 :(得分:0)
将{
替换为{\n
:
text.replace('{', '{\n')
将}
替换为\n}
:
text.replace('}', '\n}')
现在要修复被引用的括号:
text.replace('"{\n','"{')
和
text.replace('\n}"', '}"')
结合在一起:
replaced = text.replace('{', '{\n').replace('}', '\n}').replace('"{\n','"{').replace('\n}"', '}"')
输出
hello(){
imagine{
puts("{HELLO}")
}
}