Python 如何在Julia中替换字符串文字的前后斜杠?
在Python中,我可以这样替换斜杠的字符串:Python 如何在Julia中替换字符串文字的前后斜杠?,python,julia,backslash,string-literals,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" 我已经尝试过了,
>>> 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
Julia REPL以转义的形式输出字符串。最好用
println
包装东西,如println(替换(“\\”,“\\\\”)
。在这种情况下,您会得到:
julia> s = "ab\\c"
"ab\\c"
julia> println(s)
ab\c
julia> println(replace(s, "\\", "\\\\"))
ab\\c
关于正则表达式的使用,第一个r“\”
是一个部分正则表达式,解析器在关闭“
后继续并在下面的\
上生成一个错误,第二个regexp是不必要的,因为它是要插入的字符串
更新:关于Julia vs.Python转义的更多细节,请参见另一个答案
希望这有帮助!这里有两个混淆的来源,其中一个是Dan提到的打印与REPL输出问题。然而,混淆的根本原因似乎是字符串文本在Julia和Python中有不同的转义行为:
- 在Julia中,字符串文字内部的
总是转义下一个字符–单个反斜杠永远不会生成文字反斜杠,它总是与以下字符组合。如果以下字符作为转义没有特殊意义,则以下字符是由其自身生成的,并且在转义中没有反斜杠结果字符串。这里就是这种情况:以\
开头的转义没有特殊意义,因此c
与“ab\c”
相同“abc”
- 在Python中,字符串文本内部的
有时会转义下一个字符,但如果后面的字符没有特殊含义,则它不会引入转义,因此序列会产生文本反斜杠以及后面的内容。在这种情况下,\
或'ab\c'
都等于“ab\c”
(第二个反斜杠由第一个反斜杠转义,产生一个文字反斜杠)ab\\c“
c
作为转义字符没有特殊意义。如果反斜杠后面跟着其他具有特殊意义的字符作为转义字符escape(参见下面的示例),则输入字符串将完全表示其他内容
以下是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中的类似示例:
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
恰好没有特殊的转义含义。朱丽亚的字符串逃逸规则与C、C++、java、perl和露比非常相似,并从中派生出来。我不确定Python的字符串转义行为的起源是什么
更新:字符串文本中的无效转义在Julia()和Python()的未来版本中将是语法错误。这使Julia和Python对字符串文本转义的行为达成一致。替换(“\\”,“\\\\”)怎么样?(当然,在《朱莉娅》中)我可能误解了,但是
replace(s,“\\”,“\\\\”
有什么错呢。您不需要转义反斜杠。Julia REPL以转义形式输出字符串。在这种情况下,最好用println
包装东西,如println(replace(s,“\\”,“\\\”)
在REPL上虽然replace(s,“\\”,“\\\”)
仍会输出“ab\\\\\\c”
,但对于第二个replace
,错误来自第一个正则表达式(需要另一个反斜杠),第二个参数在任何情况下都应该是一个字符串:`replace(s,r“\\\”,“\\\\”)我开始编辑你的答案,以添加一些关于转义行为差异的信息,但它最终完全重写了答案,所以我写了一个不同的答案。仅供参考:不是有效转义序列的反斜杠字符对现在会生成一个DeprecationWarning。尽管这最终会成为一个语法错误,但对于一些Python版本来说,这是不可能的。谢谢,@Liso。类似地,在Julia master上,无效转义序列现在是一个语法错误:。我们决定直接出错,而不是经历一个弃用期。Python和Julia现在具有几乎相同的wrt字符串转义行为。