为什么删除字符串中非字母字符的正则表达式函数不起作用?

2024-09-27 09:28:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试挑战,我成功了,但有一次没有达到我想要的效果

这就是挑战: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,当我键入algorithm时,它确实返回false,但问题是问题中的第三个示例仍然打印出false,而因为它是一个实际的回文,它应该返回false。如果我们去掉所有非字母字符,例如点、逗号和列,这就是回文。 所以我很自然地浏览了一下互联网,看看我们如何做到这一点,发现使用正则表达式来实现这一点是最有效的方法,所以我将它实现到我的函数中。 问题是,因为总是有一个,它实际上就像regex方法根本不存在一样运行,它基本上不会删除非字母字符,而它应该。。 所以,在这里我开始知道我可能做错了什么,如果我有可能得到别人的帮助,因为我已经被困在这一天了

谢谢大家阅读这篇文章


Tags: andtherefalsetrue键入returnlevel
3条回答

您当前的方法有两个问题,在替换非字母数字字符后将主reversedString小写,然后在比较reversedString == str之前将strreversedString而不是从它自己的reversedString == str中改为str,我稍微更改了代码块,但同样的逻辑也适用于您自己的版本

import re

def isPalindrome(str):

    reversedString = re.sub(r'[^a-zA-Z\\s]', '', str).lower()
    str = reversedString[::-1]
    if reversedString == str:
        print(True)
    else:
        print(False)
        
isPalindrome('A man, a plan, a canal: Panama.')

工作演示:https://rextester.com/GBLTM37163

首先,您的正则表达式将删除大写字母。即使修改正则表达式以删除非大写和非小写字母,也会在下一行代码中删除结果(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

您可以使用re.sub()删除所有非字母字符:

import re

def isPalindrome(s):
    s = re.sub('[\W\d_]','',s).lower()
    if s == s[::-1]:
        return True
    return False

print(isPalindrome("A man, a plan, a canal: Panama."))
print(isPalindrome("algorithm"))
print(isPalindrome("level"))

输出:

True
False
True

相关问题 更多 >

    热门问题