【问题标题】:Replace special characters in a string in Python替换字符串python中的特殊字符
【发布时间】:2014-07-22 15:56:50
【问题描述】:

我正在使用 urllib 从网站获取一串 html,需要将 html 文档中的每个单词放入一个列表中。

这是我到目前为止的代码。我不断收到错误消息。我也复制了下面的错误。

import urllib.request

url = input("Please enter a URL: ")

z=urllib.request.urlopen(url)
z=str(z.read())
removeSpecialChars = str.replace("!@#$%^&*()[]{};:,./<>?\|`~-=_+", " ")

words = removeSpecialChars.split()

print ("Words list: ", words[0:20])

这是错误。

Please enter a URL: http://simleyfootball.com
Traceback (most recent call last):
  File "C:\Users\jeremy.KLUG\My Documents\LiClipse Workspace\Python Project 2\Module2.py", line 7, in <module>
    removeSpecialChars = str.replace("!@#$%^&*()[]{};:,./<>?\|`~-=_+", " ")
TypeError: replace() takes at least 2 arguments (1 given)

【问题讨论】:

    标签: python string list replace urllib


    【解决方案1】:

    您可以将特殊字符替换为所需字符,如下所示,

    import string
    specialCharacterText = "H#y #@w @re &*)?"
    inCharSet = "!@#$%^&*()[]{};:,./<>?\|`~-=_+\""
    outCharSet = "                               " #corresponding characters in inCharSet to be replaced
    splCharReplaceList = string.maketrans(inCharSet, outCharSet)
    splCharFreeString = specialCharacterText.translate(splCharReplaceList)
    

    【讨论】:

      【解决方案2】:

      一种方式是使用re.sub,这是我的首选方式。

      import re
      my_str = "hey th~!ere"
      my_new_string = re.sub('[^a-zA-Z0-9 \n\.]', '', my_str)
      print my_new_string
      

      输出:

      hey there
      

      另一种方式是使用re.escape:

      import string
      import re
      
      my_str = "hey th~!ere"
      
      chars = re.escape(string.punctuation)
      print re.sub(r'['+chars+']', '',my_str)
      

      输出:

      hey there
      

      只是一个小提示PEP-8 在 python 中的参数样式应该是 remove_special_chars 而不是 removeSpecialChars

      另外,如果您想保留空格,只需将 [^a-zA-Z0-9 \n\.] 更改为 [^a-zA-Z0-9\n\.]

      【讨论】:

      • +1 显然是它处理每种情况的最快和最好的答案,如果给定奇怪的 utf8 字符,翻译将不会做任何事情,带有负正则表达式 [^...] 的 re.sub 更安全。跨度>
      • 如何使用re.sub替换字符`?
      • 非常有帮助的答案,但在最后一行你不是说使用 [^a-zA-Z0-9\n\.] 会删除空格吗?
      【解决方案3】:

      str.replace 对于您想要做的事情来说是错误的功能(除了它被错误地使用)。您想用空格替换集合中的任何字符,而不是用单个空格替换整个集合(后者是替换的作用)。你可以像这样使用翻译:

      removeSpecialChars = z.translate ({ord(c): " " for c in "!@#$%^&*()[]{};:,./<>?\|`~-=_+"})
      

      这将创建一个映射,将特殊字符列表中的每个字符映射到一个空格,然后在字符串上调用 translate(),用空格替换特殊字符集中的每个字符。

      【讨论】:

      • 你确定正则表达式会比翻译更好吗? translate 可能在内部使用正则表达式?
      • ord 使用做得很好!否则 str.translate 对特殊字符什么都不做。
      • 谢谢!这个答案拯救了我的一天。
      • 请注意,这将替换一组字符中的任何内容,而 this answer 替换任何不在正则表达式匹配中的内容。如果目标是使字符串对于给定上下文“安全”,则后者可能是一种更安全的方法。
      【解决方案4】:

      replace 对特定的字符串进行操作,所以你需要这样调用它

      removeSpecialChars = z.replace("!@#$%^&*()[]{};:,./<>?\|`~-=_+", " ")
      

      但这可能不是您需要的,因为这将查找包含所有字符的单个字符串以相同的顺序。正如 Danny Michaud 指出的那样,您可以使用正则表达式来做到这一点。

      附带说明一下,您可能需要查找BeautifulSoup,这是一个用于解析混乱的 HTML 格式文本的库,就像您通常从网页浏览中获得的那样。

      【讨论】:

      • 我只需要使用 python 中包含的库。是否有正则表达式可以完成我想做的事情?
      • 这取决于您是否要处理英文文本、包含外来词(带有重音符号、变音符号等)、数字、货币符号等的文本。没有通用的正则表达式来“清除” up stuff",你需要具体说明你需要什么。
      【解决方案5】:

      您需要在z 而不是str 上调用replace,因为您要替换位于字符串变量z 中的字符

      removeSpecialChars = z.replace("!@#$%^&*()[]{};:,./<>?\|`~-=_+", " ")
      

      但这不起作用,因为 replace 查找子字符串,您很可能需要将正则表达式模块 resub 函数一起使用:

      import re
      removeSpecialChars = re.sub("[!@#$%^&*()[]{};:,./<>?\|`~-=_+]", " ", z)
      

      不要忘记[],它表示这是一组要替换的字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-22
        • 2014-12-07
        • 1970-01-01
        相关资源
        最近更新 更多