0

我正在尝试删除标点符号以检查一个短语(或单词)是否是回文,尽管当我有一个带有数字的单词时,它们被删除并且它返回 True 而不是 False。用 sub 清除标点符号后的“1a2”返回“a”,但它仍然应该给我“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"))
4

3 回答 3

1

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

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

查看文档以获取特殊字符列表以及如何记下[].

于 2020-03-31T08:40:05.657 回答
0

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

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

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

esc = re.escape(r',.;@#?+^:%-=()!&$')
clean = re.sub("[" + esc + "]", " ", s)
于 2020-03-31T08:40:39.273 回答
0

在您的情况下,我会使用string 模块str.maketrans中的标点符号集,因为我认为这比 regex 更具可读性:

import string
s = s.translate(str.maketrans('', '', string.punctuation))
于 2020-03-31T08:47:02.357 回答