Python 如何自定义使用string.标点符号过滤掉的字符?

Python 如何自定义使用string.标点符号过滤掉的字符?,python,regex,string,Python,Regex,String,我有一个字符串,我想删除所有标点符号。我目前使用: import string translator = str.maketrans('','', string.punctuation) name = name.translate(translator) 但是,对于名称为的字符串,这也删除了连字符,我希望保留在字符串中。例如“\Fred Daniels!应该变成“弗雷德·丹尼尔斯” 如何修改上述代码以实现此目的?如果您想从字符串中排除一些标点字符,只需删除不需要考虑的标点字符即可: >&

我有一个字符串,我想删除所有标点符号。我目前使用:

import string
translator = str.maketrans('','', string.punctuation)
name = name.translate(translator)
但是,对于名称为的字符串,这也删除了连字符,我希望保留在字符串中。例如“\Fred Daniels!应该变成“弗雷德·丹尼尔斯”


如何修改上述代码以实现此目的?

如果您想从
字符串中排除一些标点字符,只需删除不需要考虑的标点字符即可:

>>> from string import punctuation
>>> from re import sub
>>> 
>>> string = "\Fred-Daniels!"
>>> translator = str.maketrans('','', sub('\-', '', punctuation))
>>> string
'\\Fred-Daniels!'
>>> string = string.translate(translator)
>>> string
'Fred-Daniels'

注意:如果您只想排除一个或两个字符,则应使用
str.replace
。否则,最好只使用
re.sub

根据使用情况,明确列出有效字符可能更安全、更清晰:

>>> name = '\\test-1.'
>>> valid_characters = 'abcdefghijklmnopqrstuvwxyz1234567890- '
>>> filtered_name = ''.join([ x for x in name if x.lower() in valid_characters ])
>>> print(filtered_name)
test-1
请注意,许多人的名字都包含标点符号,如“玛丽·圣克劳德·史蒂文斯”、“小吉姆·昌西”等。

import string
点到移除=字符串。标点符号
打印(点到点删除)#输出:!“#$%&'()*+,-./:?”@[\]^_`{|}~
#现在假设你不想在你的点刺中移除
点到点移除=点到点移除。替换(“\u”,”)
打印(点到移除)#输出:!"#$%&'()*+,-./:;?@[\]^`{|}~

string。标点符号本身就是一个字符串。你不能从
字符串中删除
-
。标点符号
?你是在寻找正则表达式解决方案还是任何解决方案?你的标签上有正则表达式,并且已经有一个使用正则表达式的答案。如果你同意回答你问题的解决方案,我会复制它。否则,我会复制它e regex标记应该被删除,并且您应该指定您想要一个非regex解决方案,以确保保留问题的适当分类。
import string

PUNCT_TO_REMOVE = string.punctuation
print(PUNCT_TO_REMOVE) # Output : !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

# Now suppose you don't want _ in your PUNCT_TO_REMOVE

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