【问题标题】:How to remove selected characters from a string?如何从字符串中删除选定的字符?
【发布时间】:2021-03-22 19:40:30
【问题描述】:

我一直在尝试学习如何删除随机给定字符串上的特殊字符。一个随机给定的字符串可能是这样的:

uh\n  haha - yes 'nope' \t tuben\xa01337

我同时使用了正则表达式和string.translate 来尝试对我有用的方法:

import re

random_string = "uh\n  haha - yes 'nope' \t tuben\xa01337"

print(re.sub(r"/[' \n \t\r]|(\xa0)/g", '', random_string))
print("-------")
print(random_string.translate(str.maketrans({c: "" for c in "\n \xa0\t\r"})))

返回的输出:

uh
  haha - yes 'nope'      tuben 1337
-------
uhhaha-yes'nope'tuben1337

问题是它不能按我的意愿工作,因为我希望输出是:

uh haha - yes nope tuben 1337

我想知道我怎么能做到这一点?

  • \n\t\xa0 或任何类似内容应替换为一个空格
  • ' 和 " 应该替换为没有空格,只需删除 ' 和 "
  • 双空格或更多空格应替换为总共只有一个空格。这意味着如果文本中有两个或多个空格,则应将其替换为一个。
  • 任何特殊字符也应删除

【问题讨论】:

  • Python 正则表达式周围没有/

标签: python python-3.x regex replace


【解决方案1】:

你可以使用

import re
random_string = "uh\n  haha - yes 'nope' \t tuben\xa01337"
random_string = re.sub(r"\s+", " ", random_string).strip().replace('"', '').replace("'", '')
print(random_string)

请参阅Python demo

注意事项

  • re.sub(r"\s+", " ", random_string) - 将一个或多个空白字符的任何块收缩为单个常规空格字符
  • .strip() - 删除前导/尾随空格
  • .replace('"', '').replace("'", '') - 删除 "' 字符。

【讨论】:

    【解决方案2】:
    /[' \n \t\r]|(\xa0)/g
    

    这是 sed 或 Vim 等工具使用的语法,而不是 Python 的 re 模块。

    相当于

    print(re.sub(r"[' \n \t\r]|(\xa0)", '', random_string))
    

    打印出来的

    uhhaha-yesnopetuben1337
    

    这不远了,但您也删除了所有空格。

    如果你不删除空格,

    print(re.sub(r"['\n\t\r]|(\xa0)", '', random_string))
    

    你得到

    uh  haha - yes nope  tuben1337
    

    空格太多了。

    一个解决方案是使用 inverse 正则表达式(它匹配你想要保留的字符的运行)和re.findall 来获得一个单词列表,你然后可以重新加入:

    result = re.findall(r"[^' \n\t\r\xa0]+", random_string)
    print(' '.join(result))
    

    打印出来的

    uh haha - yes nope tuben 1337
    

    【讨论】:

      【解决方案3】:

      这个正则表达式可以解决问题:

      >>> print(re.sub(" +", ' ', re.sub(r'''/|[^\w\s]|\n|\t|\r|(\xa0)/g''', '', random_string)))
      uh haha yes nope tuben 1337
      

      外层re.sub匹配多个空格,并用一个空格替换。

      内部re.sub 几乎与您正在使用的相同,我只是发现将它们全部作为| 的选择更具可读性。

      【讨论】:

      • 这很不错!我假设我可以自己创建任何我想在 | 中替换的字符| ?例如| " |?如果我理解正确的话,我相信这也应该有效
      • 是的,但是不要包含空格,所以如果你也想替换",那么我会在'后面添加它,就像|'|"|一样。
      • 通过像[^A-Za-z0-9\s+]|这样删除所有特殊字符来替换特殊字符(在我们的例子中是'和“)不是更好吗?但是通过测试它也会删除所有空格,但我相信这会使代码更具可读性,而不是输入所有特殊字符print(re.sub(" +", ' ', re.sub(r'''/|\n|\t|\r|'|"|(\xa0)|[^A-Za-z0-9]|/g''', '', random_string)))
      • 这是正确的,但我似乎确实失败了。例如,没有设法在您提供的代码中应用它,您有没有机会帮我解决这个问题:(?
      • 没关系!我通过这样做解决了它:print(re.sub(" +", ' ', re.sub(r'''/|[^\w\s]|\n|\t|\r|(\xa0)/g''', '', random_string)))
      猜你喜欢
      • 2018-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 2013-04-17
      • 2011-12-08
      • 2019-12-04
      相关资源
      最近更新 更多