python re.sub 去除数字字符回文

python re.sub removes numeric characters palindrome

我正在尝试删除标点符号以检查短语(或单词)是否为回文,但当我有一个带有数字的单词时,它们会被删除并且 return True 而不是 False。使用 sub returns 'a' 清除标点符号后的“1a2”,尽管它仍应给我“1a2”。我以为我只选了标点符号来代替。

import re
def isPalindrome(s):
    clean = re.sub("[,.;@#?+^:%-=()!&$]", " ", s)
    lower = ''.join([i.lower() for i in clean.split()])
    if lower == lower[::-1]:
        return True
    else:
        return False


print(isPalindrome("1a2"))

您在正则表达式中使用了 -,您需要正确地转义它,请试试这个:

re.sub("[,.;@#?+^:%\-=()!&$]", " ", s)

doc 中查看特殊字符列表以及如何注释 []

您的正则表达式字符串中的特殊字符必须转义。即

clean = re.sub(r"[,\.;@\#\?\+\^:%\-=\(\)!\&$]", " ", s)

或使用re.escape,自动转义特殊字符

esc = re.escape(r',.;@#?+^:%-=()!&$')
clean = re.sub("[" + esc + "]", " ", s)

我会在你的情况下使用 str.maketrans and the punctuation set from the string module,因为我认为这比正则表达式更具可读性:

import string
s = s.translate(str.maketrans('', '', string.punctuation))