新样式格式说明符引发令牌化错误

时间:2018-10-02 06:50:45

标签: string python-2.7 string-formatting format-specifiers

我在变量jss中有以下字符串。

jss = '''
Java.perform(
  function()
  {
    var item = Java.use("java.util.Random"); 
    console.log("HOOKING random");
    item.nextInt.overload("int").implementation = function(a)
    {
      var ret = this.nextInt(a); 
      return {0};
    }
  }
);
'''.format("1234")

我正在尝试使用格式说明符来简单地将其传递一些值(在这种情况下为“ 1234”)。

当我尝试在iPython中运行它时,出现以下错误:

ERROR:root:An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line string', (1, 0))

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-1-a900f760c449> in <module>()
     12   }
     13 );
---> 14 '''.format("1234")

KeyError: '\n    var item = Java'

不知道这里出了什么问题。有人可以帮忙理解吗?

1 个答案:

答案 0 :(得分:1)

您需要使用{{}}来转义其他花括号-否则python格式令牌生成器希望理解该模式。 (仅在python3中测试过...)

jss = '''
Java.perform(
  function()
  {{
    var item = Java.use("java.util.Random"); 
    console.log("HOOKING random");
    item.nextInt.overload("int").implementation = function(a)
    {{
      var ret = this.nextInt(a); 
      return {0};
    }}
  }}
);
'''.format("1234")

假设您不想用作格式选项的花括号始终以多个空格开头(并且格式花括号最多以一个空格开头),则可以替换这些空格:

import re 

# with your original jss
sanitized = re.sub('(\s\s+){', r'\1{{', jss)
sanitized = re.sub('(\s\s+)}', r'\1}}', sanitized)

print(sanitized.format("1234"))

...可能有更明智的正则表达式可以满足您的需求...