首页 > 解决方案 > 为什么删除字符串中非字母字符的正则表达式函数不起作用?

问题描述

我正在尝试挑战,我设法成功了,但在某种情况下它并没有按照我想要的方式工作。

这是挑战:Given a string, return whether or not it forms a palindrome ignoring case and non-alphabetical characters. Note: a palindrome is a sequence of characters that reads the same forwards and backwards. Ex: Given the following strings... "level", return true "algorithm", return false "A man, a plan, a canal: Panama.", return true

这是我的代码:

import re

def isPalindrome(str):

    reversedString = re.sub(r'[^a-z]', '', str)
    reversedString = str[::-1]
    if reversedString == str:
        print(True)
    else:
        print(False)

所以,当我输入例如'level'时,它确实返回true,当我输入算法时确实返回false,但问题是问题中的第三个示例仍然打印出false,而因为它是一个实际的回文,它应该返回假。如果我们去掉所有非字母字符,例如点、逗号和列,它就是回文。所以我自然而然地浏览了互联网,看看我们怎么可能做到这一点,发现使用正则表达式是最有效的方法,所以我将它实现到我的函数中。问题是,因为总是有一个,它实际上就像 regex 方法根本不存在一样运行,它基本上不会删除非字母字符,而它应该......所以,在这里我开始知道我可能做错了,如果我能得到别人的帮助,

感谢大家阅读本文!

标签: pythonpython-3.xregexfunctionmethods

解决方案


首先,您的正则表达式将删除大写字母。即使您修改了正则表达式以删除非大写和非小写字母,您也会reversedString在下一行代码中破坏您的结果 ()。

您确实需要首先将输入字符串转换为全部小写或全部大写(实际上是小写,因为您要删除非小写字母),因为您的输入是混合的,并且您的回文不会向前读取相同的内容和倒退,除非你这样做。

import re

def isPalindrome(str):

    str = str.lower()
    filteredString = re.sub(r'[^a-z]', '', str)
    reversedString = filteredString[::-1]
    if reversedString == filteredString:
        print(True)
    else:
        print(False)

>>> isPalindrome("A man, a plan, a canal: Panama.")
True

推荐阅读