我想用反斜杠单引号('
)替换所有出现的单引号(\'
)。我尝试使用gsub
执行此操作,但我得到了部分字符串重复:
a = "abc 'def' ghi"
a.gsub("'", "\\'")
# => "abc def' ghidef ghi ghi"
有人可以解释为什么会发生这种情况以及解决方案是什么?
答案 0 :(得分:3)
这是因为"\\'"
作为gsub
的替换参数出现时具有特殊含义,即它意味着匹配后的子字符串。
要做你想做的事,你可以使用一个块:
a.gsub("'"){"\\'"}
# => "abc \\'def\\' ghi"
请注意,反斜杠在字符串检查中被转义,因此它显示为\\
。
答案 1 :(得分:3)
您的"\\'"
实际上代表文字\'
,因为反斜杠会转义下一个反斜杠。 Ruby正则表达式中的文字\'
实际上是一个特殊变量,它插入匹配部分后面的字符串部分。所以这就是发生的事情。
abc 'def' ghi
^
插入符号指向第一个匹配项'
。将其替换为右侧的所有内容,即 def' ghi
。
abc def' ghidef' ghi
++++++++
现在找到下一场比赛:
abc def' ghidef' ghi
^
再次将'
替换为右侧的所有内容,即 ghi
。
abc def' ghidef ghi ghi
++++
答案 2 :(得分:2)
你可能需要更高剂量的逃避:
from collections import defaultdict
size_counts = defaultdict(int)
for size, cnt in zip(shoesizes, quantities):
size_counts[size] += cnt
orderedsizes, totalquant = map(list, zip(*sorted(size_counts.items())))
<强>结果强>:
abc \'def \'ghi