【问题标题】:How to escape special char如何逃脱特殊字符
【发布时间】:2013-04-14 00:30:18
【问题描述】:

我得到了以下代码来处理中文字符问题,或者powerpoint文件中的一些特殊字符,因为我想使用ppt的内容作为文件名来保存。 如果它包含一些特殊字符,它会抛出一些异常,所以我使用下面的代码来处理它。

它在 Python 2.7 下运行良好,但是当我使用 Python 3.0 运行时,它给了我以下错误:

    if not (char in '<>:"/\|?*'):
TypeError: 'in <string>' requires string as left operand, not int

我用谷歌搜索了错误消息,但我不明白如何解决它。我知道codeif not (char in '&lt;&gt;:"/\|?*'):是把字符转换成ASCII码数吧?

有什么例子可以解决我在 Python 3 中的问题吗?

def rm_invalid_char(self,str):

    final=""
    dosnames=['CON', 'PRN', 'AUX', 'NUL', 'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9', 'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9']
    for char in str:
        if not (char in '<>:"/\|?*'):
            if ord(char)>31:
                final+=char
        if final in dosnames:
            #oh dear...
            raise SystemError('final string is a DOS name!')
        elif final.replace('.', '')=='':
            print ('final string is all periods!')
            pass
    return final

【问题讨论】:

  • 你能不能修改你的代码来捕捉 TypeError 异常,print(char),然后看看是什么让它窒息?由于某种原因,您的字符串被解释为带有整数的数组。
  • 当我打印 char 时,它显示 232。我认为它阻塞了字符串,char-wise?

标签: python character-encoding python-3.x ascii


【解决方案1】:

简单:使用这个

re.escape(YourStringHere)

来自文档:

返回所有非字母数字反斜杠的字符串;这很有用 如果您想匹配可能具有常规的任意文字字符串 表达式元字符。

【讨论】:

  • 我把它改成if not char in re.escape('&lt;&gt;:"/\|?*') :。它也不起作用
  • Re.escape 转义字符串中的特殊字符,您可以像 re.escape("hello ' world") 一样使用它来转义 '
【解决方案2】:

您将第一个元素是整数 (232) 的可迭代对象传递给 rm_invalid_char()。问题不在于这个函数,而在于调用者。

一些调试是为了:在rm_invalid_char()的开头,你应该做print(repr(str)):你不会看到一个字符串,这与rm_invalid_char()的预期相反。您必须通过调整代码 before rm_invalid_char() 来解决此问题,直到看到您期望的字符串。

问题可能是由于 Python 2 和 Python 3 处理字符串的方式(在 Python 2 中,str 对象是字节字符串,而在 Python 3 中,它们是字符串)。

【讨论】:

  • 由于问题很可能发生在调用您发布的代码的代码中,因此我需要您发布该代码以便给出更具体的答案。我的回答更笼统:通过打印语句,您通常可以弄清楚发生了什么,并在代码中找到问题所在的位置,以便您可以修复它。
【解决方案3】:

我很好奇为什么“str”中有一些东西像整数一样 - 输入发生了一些奇怪的事情。

但是,我怀疑你是否:

  • str 值的名称更改为其他名称,例如char_string
  • for char in char_string 之后将您输入的字符串强制转换为字符串

那么你描述的问题就解决了。

您也可以考虑在生成的文件名末尾添加一个随机位,这样您就不必担心与 DOS 保留名称发生冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多