我有一些代码的情况,eval()作为一种可能的解决方案.现在我从来没有使用eval()过,但是,我已经发现了很多关于它可能造成的潜在危险的信息.也就是说,我对使用它非常谨慎.
我的情况是我有一个用户给出的输入:
datamap = raw_input('Provide some data here: ')
Run Code Online (Sandbox Code Playgroud)
哪里datamap需要是字典.我四处搜索,发现eval()可以解决这个问题.我认为在尝试使用数据之前我可以检查输入的类型,这将是一个可行的安全预防措施.
datamap = eval(raw_input('Provide some data here: ')
if not isinstance(datamap, dict):
return
Run Code Online (Sandbox Code Playgroud)
我仔细阅读了文档,但我仍然不清楚这是否安全.eval在输入或datamap调用变量后立即评估数据吗?
该ast模块是.literal_eval()唯一安全的选择吗?
假设我有一个字符串,它是另一个字符串的反斜杠转义版本.在Python中,有一种简单的方法可以解除字符串的问题吗?例如,我可以这样做:
>>> escaped_str = '"Hello,\\nworld!"'
>>> raw_str = eval(escaped_str)
>>> print raw_str
Hello,
world!
>>>
Run Code Online (Sandbox Code Playgroud)
但是,这涉及将(可能不受信任的)字符串传递给eval(),这是一个安全风险.标准库中是否有一个函数,它接受一个字符串并产生一个没有安全隐患的字符串?
我有一些需要转义的转义字符串.我想用Python做这件事.
例如,在python2.7中,我可以这样做:
>>> "\\123omething special".decode('string-escape')
'Something special'
>>>
Run Code Online (Sandbox Code Playgroud)
我如何在Python3中完成它?这不起作用:
>>> b"\\123omething special".decode('string-escape')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: unknown encoding: string-escape
>>>
Run Code Online (Sandbox Code Playgroud)
我的目标是成为一个像这样的字符串:
s\000u\000p\000p\000o\000r\000t\000@\000p\000s\000i\000l\000o\000c\000.\000c\000o\000m\000
Run Code Online (Sandbox Code Playgroud)
把它变成:
"support@psiloc.com"
Run Code Online (Sandbox Code Playgroud)
在进行转换之后,我将探测我的字符串是用UTF-8还是UTF-16编码的.
给定一个包含字符串的变量是否可以快速将其转换为另一个原始字符串变量?
以下代码应说明我所追求的内容:
line1 = "hurr..\n..durr"
line2 = r"hurr..\n..durr"
print(line1 == line2) # outputs False
print(("%r"%line1)[1:-1] == line2) # outputs True
Run Code Online (Sandbox Code Playgroud)
到目前为止我找到的最接近的是%r格式化标志,它似乎返回一个原始字符串,尽管在单引号内.有没有更简单的方法来做这种事情?
所以我似乎无法弄清楚这一点......我有一个字符串说,"a\\nb"我希望这成为"a\nb".我已经尝试了以下所有,似乎没有工作;
>>> a
'a\\nb'
>>> a.replace("\\","\")
File "<stdin>", line 1
a.replace("\\","\")
^
SyntaxError: EOL while scanning string literal
>>> a.replace("\\",r"\")
File "<stdin>", line 1
a.replace("\\",r"\")
^
SyntaxError: EOL while scanning string literal
>>> a.replace("\\",r"\\")
'a\\\\nb'
>>> a.replace("\\","\\")
'a\\nb'
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么最后一个有效,因为这很好用:
>>> a.replace("\\","%")
'a%nb'
Run Code Online (Sandbox Code Playgroud)
这里有什么我想念的吗?
编辑我明白\是一个转义字符.我在这里要做的是将所有\\n \\t等等转换成\n \t等等,并且替换似乎没有像我想象的那样工作.
>>> a = "a\\nb"
>>> b = "a\nb"
>>> print a
a\nb
>>> print b
a
b
>>> a.replace("\\","\\")
'a\\nb'
>>> a.replace("\\\\","\\")
'a\\nb'
Run Code Online (Sandbox Code Playgroud)
我希望字符串a看起来像字符串b.但是替换不是像我想的那样替换斜线.
我有一个字符串.在那个字符串是双反斜杠.我想用单个反斜杠替换双反斜杠,以便可以正确解析unicode char代码.
(Pdb) p fetched_page
'<p style="text-align:center;" align="center"><strong><span style="font-family:\'Times New Roman\', serif;font-size:115%;">Chapter 0<\\/span><\\/strong><\\/p>\n<p><span style="font-family:\'Times New Roman\', serif;font-size:115%;">Chapter 0 in \\u201cDreaming in Code\\u201d give a brief description of programming in its early years and how and why programmers are still struggling today...'
Run Code Online (Sandbox Code Playgroud)
在此字符串内,您可以看到转义的unicode字符代码,例如:
\\u201c
Run Code Online (Sandbox Code Playgroud)
我想把它变成:
\u201c
Run Code Online (Sandbox Code Playgroud)
尝试1:
fetched_page.replace('\\\\', '\\')
Run Code Online (Sandbox Code Playgroud)
但这不起作用 - 它搜索四倍反斜杠.
尝试2:
fetched_page.replace('\\', '\')
Run Code Online (Sandbox Code Playgroud)
但这会导致行尾错误.
尝试3:
fetched_page.decode('string_escape')
Run Code Online (Sandbox Code Playgroud)
但这对文本没有影响.所有双反斜杠仍然是双反斜杠.
我在Python中收到很多这样的警告:
DeprecationWarning: invalid escape sequence \A
orcid_regex = '\A[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{3}[0-9X]\Z'
DeprecationWarning: invalid escape sequence \/
AUTH_TOKEN_PATH_PATTERN = '^\/api\/groups'
DeprecationWarning: invalid escape sequence \
"""
DeprecationWarning: invalid escape sequence \.
DOI_PATTERN = re.compile('(https?://(dx\.)?doi\.org/)?10\.[0-9]{4,}[.0-9]*/.*')
<unknown>:20: DeprecationWarning: invalid escape sequence \(
<unknown>:21: DeprecationWarning: invalid escape sequence \(
Run Code Online (Sandbox Code Playgroud)
他们的意思是什么?我该如何解决它们?
我有一个像\ uXXXX(表示)的字符串,我需要将其转换为unicode.我从第三方服务收到它,因此python解释器不转换它,我需要在我的代码中进行转换.我怎么用Python做的?
>>> s
u'\\u0e4f\\u032f\\u0361\\u0e4f'
Run Code Online (Sandbox Code Playgroud) 在Python中,我有一个这样的字符串:
'\\x89\\n'
Run Code Online (Sandbox Code Playgroud)
如何将其解码为普通字符串,如:
'\x89\n'
Run Code Online (Sandbox Code Playgroud) 假设我从json获得了一个unicode字符串u'a\tb',如果是的话print,我会得到a b.但是我现在想要的是打印一个完全相同的字符串a\tb.我该怎么做?