Can I make a code in python that ignores special characters such as commas, spaces, exclamation points, etc?

我们两清 提交于 2019-12-20 05:01:15

问题


I want to create a code that will return "true" (if I type in a palindrome regardless of case or if there are special characters in it), and "false" otherwise. The code I have so far works for phrases with no special characters such as commas, apostrophes, spaces, etc.

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")

when I do:

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

it returns True because it is a palindrome

when I do:

 print (is_palindrome("Hello World!"))

it returns False because it is not a palindrome

when I do:

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

it returns False. but I want to create a code that considers this a palindrome


回答1:


You need to filter before testing then:

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

would pick out only the letters and lowercase them, after which you can test of those letters form a palindrome:

return letters == letters[::-1]

This works because str.isalpha() returns True only for letters.

Combined into your function:

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

Demo:

>>> 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



回答2:


my_str = my_str.casefold()
my_str = ''.join(e for e in my_str if e.isalpha())

This should recreate my_str with only alphabetical characters, using .isalpha(). Then do the test on that. If you want to keep a record of original string, just stored the recreated version is a temporary string.




回答3:


If you just want to exclude punctuation and spaces you can use 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]



回答4:


You may get just alphanumeric character in your string;

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

By the way this one works, if you ignores non-ASCII chars.



来源:https://stackoverflow.com/questions/26745193/can-i-make-a-code-in-python-that-ignores-special-characters-such-as-commas-spac

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!