如何在Julia中替换字符串文字后退/前斜杠?

时间:2017-03-30 09:44:44

标签: python julia backslash string-literals

在Python中,我可以对字符串替换斜杠:

>>> s = 'ab\c'
>>> s.replace('\\', '\\\\')
'ab\\\\c'
>>> print s.replace('\\', '\\\\')
ab\\c

在朱莉娅,当我能做到这一点时:

julia> s = "ab\\c"
"ab\\c"

julia> replace(s, "\\\\", "\\\\\\\\")
"ab\\c"

我试过这个,但它会引发一些语法错误:

julia> replace(s, r"\", r"\\")
ERROR: syntax: "\" is not a unary operator

2 个答案:

答案 0 :(得分:4)

Julia REPL以转义形式输出字符串。最好用println包裹println(replace(s, "\\", "\\\\"))。在这种情况下,你得到:

julia> s = "ab\\c"
"ab\\c"

julia> println(s)
ab\c

julia> println(replace(s, "\\", "\\\\"))
ab\\c

关于正则表达式的使用,第一个r"\"是部分正则表达式,解析器继续并在关闭\之后在以下"生成错误,第二个regexp是不必要的,因为它是要插入的字符串。

更新:在另一个答案中有关Julia与Python逃避的更多细节。

希望这有帮助!

答案 1 :(得分:3)

这里有两个混乱的来源,其中一个是Dan提到的打印与REPL输出问题。然而,混淆的根本原因似乎是字符串文字在Julia和Python中具有不同的转义行为:

  • 在Julia中,字符串文字中的\总是转义下一个字符 - 单个反斜杠从不产生文字反斜杠,它总是与以下字符组合。如果以下字符作为转义没有特殊含义,则后续字符将自行生成,并且结果字符串中不会出现反斜杠。这就是这种情况:从c开始逃避没有特殊意义,因此"ab\c""abc"相同。

  • 在Python中,字符串文字中的\有时会转义下一个字符,但如果后面的字符没有特殊含义,则它不会引入转义符所以序列产生一个字面反斜杠以及后面的内容。在这种情况下,'ab\c'"ab\c"都等于"ab\\c"(第二个反斜杠由第一个反斜杠转义,产生一个字面反斜杠)。

请注意,两个反斜杠形式是Python提示符如何将字符串打印回给您 - 这是编写此字符串的标准方法,正确转义,而不是依赖于c没有特殊含义的事实作为逃避角色。如果反斜杠后跟一些具有特殊含义的其他字符作为转义(参见下面的示例),则输入字符串将完全意味着其他内容。

这里有一些Python的例子:

>>> [c for c in "ab\c"]
['a', 'b', '\\', 'c']

>>> [c for c in "ab\\c"]
['a', 'b', '\\', 'c']

>>> [c for c in "a\bc"]
['a', '\x08', 'c']

>>> [c for c in "a\\bc"]
['a', '\\', 'b', 'c']

>>> [c for c in "\abc"]
['\x07', 'b', 'c']

>>> [c for c in "\\abc"]
['\\', 'a', 'b', 'c']

以下是朱莉娅的类似例子:

julia> [c for c in "ab\c"]
3-element Array{Char,1}:
 'a'
 'b'
 'c'

julia> [c for c in "ab\\c"]
4-element Array{Char,1}:
 'a'
 'b'
 '\\'
 'c'

julia> [c for c in "a\bc"]
3-element Array{Char,1}:
 'a'
 '\b'
 'c'

julia> [c for c in "a\\bc"]
4-element Array{Char,1}:
 'a'
 '\\'
 'b'
 'c'

julia> [c for c in "\abc"]
3-element Array{Char,1}:
 '\a'
 'b'
 'c'

julia> [c for c in "\\abc"]
4-element Array{Char,1}:
 '\\'
 'a'
 'b'
 'c'

转义\a\b在两种语言中都有特殊含义 - 它们在每种语言中编码ASCII“bell”和“backspace”字符。不同之处在于序列\c:在Julia中,它只编码字符c,而在Python中它编码两个字符 - 反斜杠和c - 因为c恰好没有作为逃避的特殊意义。 Julia的字符串转义规则非常类似于C,C ++,Java,Perl和Ruby,并且是从它们派生出来的。我不确定Python的字符串转义行为的来源是什么。

更新:在Julia(issue #21284)和Python(3.6 release notes)的未来版本中,字符串文字中的无效转义将是语法错误。这使得Julia和Python的行为能够将字符串文字转换为协议。