【问题标题】:Replace all non-alphanumeric characters in a string替换字符串中的所有非字母数字字符
【发布时间】:2012-10-10 17:30:33
【问题描述】:

我有一个字符串,我想用它用星号替换任何不是标准字符或数字的字符,例如(a-z 或 0-9)。例如,“h^&ell`.,|o w]{+orld”被替换为“h*ell*o*w*orld”。请注意,多个字符(例如“^&”)将替换为一个星号。我该怎么做呢?

【问题讨论】:

标签: python


【解决方案1】:

正则表达式助你一臂之力!

import re

s = re.sub('[^0-9a-zA-Z]+', '*', s)

例子:

>>> re.sub('[^0-9a-zA-Z]+', '*', 'h^&ell`.,|o w]{+orld')
'h*ell*o*w*orld'

【讨论】:

  • 如果你经常处理 unicode,你可能还需要保留所有非 ASCII unicode 符号:re.sub("[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+", " ", ":%# unicode ΣΘΙП@./\n")
  • 如果你想在字符串中保留空格,只需在括号内添加一个空格:s = re.sub('[^0-9a-zA-Z ]+', '*', s)
  • 如果进行多次替换,如果您预编译正则表达式,这会稍微快一些,例如,import re; regex = re.compile('[^0-9a-zA-Z]+'); regex.sub('*', 'h^&ell.,|o w]{+orld')
  • 另请注意\W 用于非单词字符,几乎相同但允许下划线作为单词字符(不知道为什么):docs.python.org/3.6/library/re.html#index-32
  • 您不需要正则表达式中的“+”
【解决方案2】:

蟒蛇式的方式。

print "".join([ c if c.isalnum() else "*" for c in s ])

这不涉及对多个连续的不匹配字符进行分组,即

"h^&i => "h**i 不是 "h*i" 就像在正则表达式解决方案中一样。

【讨论】:

    【解决方案3】:

    试试:

    s = filter(str.isalnum, s)
    

    在 Python3 中:

    s = ''.join(filter(str.isalnum, s))
    

    编辑: 意识到OP想要用'*'替换非字符。我的答案不适合

    【讨论】:

      【解决方案4】:

      使用\W,它等同于[^a-zA-Z0-9_]。检查文档,https://docs.python.org/2/library/re.html

      import re
      s =  'h^&ell`.,|o w]{+orld'
      replaced_string = re.sub(r'\W+', '*', s)
      output: 'h*ell*o*w*orld'
      

      更新:此解决方案也将排除下划线。如果您只想排除字母和数字,那么 nneonneo 的解决方案更合适。

      【讨论】:

      • 请注意,\W 仅在 Python 2.x 中等同于 [^a-zA-Z0-9_]。在 Python 3.x 中,\W+ 仅在使用 re.ASCII / re.A 标志时才等效于 [^a-zA-Z0-9_]
      • 更新了link to the documentation of re,在“匹配Unicode 单词字符”页面中搜索\W;这包括可以成为任何语言单词一部分的大多数字符,以及数字和下划线。如果使用 ASCII 标志,则仅匹配 [a-zA-Z0-9_]。"
      猜你喜欢
      • 2010-12-20
      • 1970-01-01
      • 2018-11-25
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 2010-12-01
      • 1970-01-01
      相关资源
      最近更新 更多