【问题标题】:Slash replacement inside a raw string原始字符串中的斜线替换
【发布时间】:2013-08-12 15:37:29
【问题描述】:

只是一个关于原始字符串、正则表达式模式和替换的简单问题:

我有一个字符串变量定义如下:

> print repr(foo)

'\n\t\t\n\t\tIf (GUTIAttach>=1) //In case of GUTI attach Enodeb should not ask RRCUecapa again\n\t\tUECapInfo;//Mps("( \\"rat_Type\\":0 \\"ueCapabilitiesRAT_Container\\":hex:011c0000000080 )");

我的问题是字符"("")",我想在原始字符串中用"\(""\)" 替换它们,因为它将在之后用作正则表达式模式。

我试过用这个方法:

foo_tmp= [inc.replace(')', '\)') for inc in foo]
foo_tmp= [inc.replace('(', '\)') for inc in foo_tmp]
foo = "".join(foo_tmp)

结果给出:

 > print repr(foo)

'\n\t\t\n\t\tIf \\(GUTIAttach>=1\\) //In case of GUTI attach Enodeb should not ask RRCUecapa again\n\t\t{\n\t\t\tUECapInfo;//Mps\\("\\( \\"rat_Type\\":0 \\"ueCapabilitiesRAT_Container\\":hex:011c0000000080 \\)"\\);

字符 "("")" 已替换为 "\\(""//)",而不是 "\(""\)"。 这对我来说有点出乎意料,所以你知道我怎样才能在不改变字符串其他部分的情况下只得到一个斜杠吗?

注意:方法.decode('string_escape') 也由于字符串的其余部分而不起作用。原始原始字符串中已存在的双斜杠不得更改。

非常感谢您的帮助

【问题讨论】:

    标签: python regex replace


    【解决方案1】:

    使用re.escape() function 转义正则表达式元字符为您

    您所看到的是完全正常的 Python 行为;您正在查看 python 文字 representation;输出可以粘贴回 Python 解释器并重新创建值。因此,任何可能被解释为转义码的东西都会为您转义;单个\ 通常会被加倍以防止它被解释为转义序列的开始:

    >>> '\('
    '\\('
    >>> print '\\('
    \(
    

    您可以在foo 字符串的其他地方看到这一点; \n 字符组合代表一个换行符,不是两个单独的字符 \n。如果您想在文本中包含文字 \n,则必须将反斜杠加倍为 \\n。进一步了解foo 的值,您会发现\\",它是一个单个 反斜杠,后跟一个" 引号。

    【讨论】:

    • 我同意你的评论。谢谢你的解释。但是,re.espace() 函数不适用于我的问题。我试过了,结果如下:print repr(foo2) #Original string '\n\t\tIf (_ActivateEvents>=1) {Log "RECV SecurityMode_ind";}\n\t\t-> send_RRC_SecurityModeComplete;\n\t' and test = re.espace(foo2) print repr(test) '\\\n\\\t\\\tIf\\ \\(\\_ActivateEvents\\>\\=1\\)\\ \\{Log\\ \\"RECV\\ SecurityMode\\_ind\\"\\;\\}\\\n\\\t\\\t\\-\\>\\ send\\_RRC\\_SecurityModeComplete\\;\\\n\\\t'
    • re.escape() 函数相当保守,它会在任何非字母或数字的前面添加一个斜杠。就re 模块而言,额外的斜杠不会产生影响,除非你有类似\d 的东西,它应该被解释为正则表达式'digits' 类,真的。还是试试吧。
    • 我尽我所能,但没有成功。我改变了我的表达方式:foo_tmp= [inc.replace(')', '.*?') for inc in foo]。这更像是一种解决方法而不是解决方案,但它可以正常工作。无论如何感谢您的帮助
    • 为什么是'.*?' 而不是r'\('
    猜你喜欢
    • 2018-12-01
    • 2019-08-25
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    相关资源
    最近更新 更多