在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
答案 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的行为能够将字符串文字转换为协议。