regex-如何指定要排除的表达式

时间:2018-11-20 13:23:21

标签: regex python-3.x

我需要用{}替换两个字符{\n\n}。 但是它们一定不能被''""包围。

我尝试使用此代码来实现这一目标

text = 'hello(){imagine{myString("HELLO, {WORLD}!")}}'
replaced = re.sub(r'{', "{\n", text)
Ellipsis...

自然地,此代码替换了用引号引起来的大括号。

可以在正则表达式中使用的!not这样的否定语句是什么?

以下是我想要的。

hello(){
imagine{
puts("{HELLO}")
}
}

简而言之-我要做的是

  1. 搜索{}
  2. 如果未包含在''""
  3. {}替换为{\n\n}

相反,我可以用(?P<a>\".*){(?P<b>.*?\")解决。 但是我不知道如何解决我的情况。

4 个答案:

答案 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}")
}
}

更新

尝试:https://regex101.com/r/DBgkrb/1

答案 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}")
}
}