【问题标题】:Re-render string as a raw string [duplicate]将字符串重新渲染为原始字符串[重复]
【发布时间】:2013-08-29 06:06:15
【问题描述】:

单行:给定一个字符串,我们如何获得它的原始字符串表示形式?


我正在生成一个文件,其中有正则表达式,例如'[ \\n\\t\\r\\f\\v]',我希望将其呈现为原始字符串。如何实现?

P.S:我实际上也打算用双引号表示字符串,因此字符串'\'' 呈现为"'"。我也需要这方面的帮助..

“原始字符串”是指我们经常用于正则表达式的字符串类型:

>>> r"[ \r\n\f\v\t]"
'[ \\r\\n\\f\\v\\t]'
# assuming to_raw is the function
>>> print to_raw(r"[ \r\n\f\v\t]")
r'[ \r\n\f\v\t]'
>>> print to_raw("\\\\")
r'\\'
>>> print to_raw("'")
r"'"

【问题讨论】:

  • 有没有尝试过?
  • @Jerry Yes.. 尝试替换 repr,但不能很好地呈现 unicode(打印 unicode 转义,不受欢迎)。双引号的情况相同。
  • 1. b'\ra\\w'.decode('raw-unicode-escape') => '\ra\\w' 2. “原始字符串”是什么意思?
  • @User 1. 不! 2.检查更新。
  • 使用正则表达式执行此操作可能有点困难,请查看此question 解决您的问题。

标签: python regex string python-2.7


【解决方案1】:

如果您的字符串来自原始字符串,它会出现在您的源代码中的r''r""r''''''r"""""" 中,没有其他特殊转义。其中之一将起作用:

import ast

def rawstringify(s):
    for format in ["r'{}'", 'r"{}"', "r'''{}'''", 'r"""{}"""']:
        rawstring = format.format(s)
        try:
            reparsed = ast.literal_eval(rawstring)
            if reparsed == s:
                return rawstring
        except SyntaxError:
            pass
    raise ValueError('rawstringify received an invalid raw string')

演示:

>>> print rawstringify(r'')
r''
>>> print rawstringify(r'\n\r\b\t')
r'\n\r\b\t'
>>> print rawstringify(r"'")
r"'"
>>> print rawstringify(r'\
... ')
r'\
'
>>> print rawstringify(r'''asdf
... ''')
r'''asdf
'''
>>> print rawstringify('\\')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 10, in rawstringify
ValueError: rawstringify received an invalid raw string

【讨论】:

  • @wim:您似乎在此处应用了额外的repr 层。 The output is fine in my tests.
  • 其实很聪明。可以对其进行修改以更好地处理 unicode,例如ur'\U0001f4a9' 是一个有效的原始字符串,但会导致此代码崩溃。
  • @wim: ur 字符串真的很奇怪。它们在 Python 2 中只是半原始的; Unicode 转义仍然得到处理。在 Python 3 中根本不允许使用 ur。我不记得五年前我是否有意识地决定排除 ur 字符串,但现在看,我想我不想尝试添加支持。
【解决方案2】:

在一行中:给定一个字符串,我们如何得到一个原始字符串 代表它?

原始字符串只是转义任何特殊序列:

>>> s
'This is some string \n that is not \raw'
>>> print(s)
This is some string
awhat is not
>>> i = s.encode('string_escape')
>>> i
'This is some string \\n that is not \\raw'
>>> print(i)
This is some string \n that is not \raw
>>> i == r'This is some string \n that is not \raw'
True
>>> i == s
False

【讨论】:

  • 我想做的是从像i这样的字符串到r'This is some string \n that is not \raw'
  • 它与您输入的字符串完全相同。您可以从我所做的比较中看到。您遇到的实际问题是什么?
  • 我要做的是从"I'm \\raw"r"I'm \raw" 这样的字符串中获取。所以如果我们有一个正则表达式,它是在打印时呈现原始的。我明天会更详细地回复评论,现在已经很晚了......(我要去上学):-) ...
猜你喜欢
  • 2016-09-17
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多