我可以用Python编写忽略特殊字符(如逗号、空格、感叹号等)的代码吗?

1 投票
4 回答
3043 浏览
提问于 2025-05-01 15:58

我想写一段代码,输入一个回文(不管字母大小写或里面有没有特殊字符),就能返回“true”,否则返回“false”。我现在的代码只能处理没有特殊字符的短语,比如逗号、撇号、空格等等。

def is_palindrome(my_str):
    my_str= my_str.casefold()
    rev_str= reversed(my_str)

if list(my_str) == list(rev_str):
   print("True")
else:
   print("False")

当我输入:

 print (is_palindrome("Rats live on no evil star"))

它返回 True,因为这是一个回文

当我输入:

 print (is_palindrome("Hello World!"))

它返回 False,因为这不是一个回文

当我输入:

 print (is_palindrome("Madam, I'm Adam"))

它返回 False。但我想写一段代码,让它把这个也算作回文

暂无标签

4 个回答

-1

你的字符串中可能只包含字母和数字字符;

re.sub(r'[^a-zA-Z0-9]+', '', your_string).lower()

顺便说一下,这个方法有效,但它会忽略掉非ASCII字符。

0

如果你只是想去掉标点符号和空格,可以使用 str.translate 这个方法:

from string import punctuation

d = {k: None for k in punctuation}
d[" "] = None

def is_palindrome(my_str):
    trans = str.maketrans(d)
    my_str = my_str.translate(trans).casefold()
    return my_str == my_str[::-1]
2
my_str = my_str.casefold()
my_str = ''.join(e for e in my_str if e.isalpha())

这段话的意思是,你可以用.isalpha()这个方法来重新生成一个只包含字母的字符串my_str。然后在这个新的字符串上进行测试。如果你想保留原来的字符串,可以把重新生成的版本暂时存储在一个新的字符串里。

8

你需要在测试之前先进行过滤:

letters = [c.casefold() for c in my_str if c.isalpha()]

这段代码会挑选出所有的字母,并把它们转换成小写,之后你就可以检查这些字母是否组成了一个回文(即正着读和反着读都一样的字符串):

return letters == letters[::-1]

之所以这样做是因为 str.isalpha() 这个方法只会对字母返回 True

把这些结合到你的函数里:

def is_palindrome(my_str):
    letters = [c.casefold() for c in my_str if c.isalpha()]
    return letters == letters[::-1]

演示:

>>> def is_palindrome(my_str):
...     letters = [c.casefold() for c in my_str if c.isalpha()]
...     return letters == letters[::-1]
... 
>>> is_palindrome("Rats live on no evil star")
True
>>> is_palindrome("Hello World!")
False
>>> is_palindrome("Madam, I'm Adam")
True

撰写回答