如何从字符串中删除选定字符?

2024-10-02 22:29:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在努力学习如何删除随机给定字符串上的特殊字符。随机给定的字符串可能类似于:

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

我使用regex和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或任何类似内容应替换为一个空格
  • '和'应替换为无空格,只需删除'和'
  • 双空格或多个空格应替换为总共一个空格。这意味着,如果文本中有两个或多个空格,则应将其替换为一个
  • 任何特殊字符也应删除

Tags: 字符串restringrandomtranslateyesxa0空格
3条回答
/[' \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

它有太多的空间

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

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

哪张照片

uh haha - yes nope tuben 1337

此正则表达式将实现以下功能:

>>> 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与您正在使用的几乎相同,我只是发现将它们都作为|的选项更具可读性

你可以用

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("'", '')-删除"'字符

相关问题 更多 >