python re.sub удаляет цифры c символов палиндрома - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь удалить пунктуацию, чтобы проверить, является ли фраза (или слово) палиндромом, хотя, когда у меня есть слово с числами, они удаляются, и оно возвращает True вместо False. «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"))

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Вы используете - внутри своего регулярного выражения, и вам нужно правильно его избежать, попробуйте вместо этого:

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

Посмотрите на do c для список специальных символов и как отметить [].

0 голосов
/ 31 марта 2020

Я бы использовал str.maketrans и пунктуацию из строкового модуля в вашем случае, потому что я думаю, что это более читабельно, чем регулярное выражение:

import string
s = s.translate(str.maketrans('', '', string.punctuation))
0 голосов
/ 31 марта 2020

Специальные символы должны быть экранированы в строке регулярных выражений. Т.е.

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

или использовать re.escape, который автоматически экранирует специальные символы

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