提问者:小点点

为什么用于移除字符串中非字母字符的regex函数不起作用?


我在尝试一个挑战,我成功了,但有一次它没有按照我想要的方式工作。

这里有一个挑战:给定一个字符串,返回它是否构成回文,忽略大小写和非字母字符。 注意:回文是向前和向后读数相同的字符序列。 例:给定以下字符串。。。 “level”,返回true“algorithm”,返回false“a man,a plan,a canal:panama.”,返回true

下面是我的代码:

import re

def isPalindrome(str):

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

因此,当我键入instance'level'时,它确实返回true,当我键入algorithm is时,它确实返回false,但问题是问题中的第三个示例仍然打印出false,而由于它是一个实际的回文,它应该返回false。 如果我们去掉所有非字母字符,如点,逗号和列,这就是回文。 所以我很自然地浏览了一下互联网,看看我们如何才能做到这一点,发现使用正则表达式做这件事是最有效的方法,所以我把它实现到了我的函数中。 问题是,因为总有一个,它实际上运行起来就像regex方法根本不存在一样,它基本上不移除非字母字符,而它应该。。。 所以,在这里,我开始知道我可能做错了什么,以及我是否可能得到别人的帮助,因为我已经在这上面困了一天了。

谢谢大家阅读这篇文章!


共3个答案

匿名用户

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

匿名用户

当前的方法有几个问题,在替换非字母数字字符后使主要的ReversedString小写,然后在比较ReversedString==Str之前使Str来自ReversedString不是来自它自己的。

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)
        
print(isPalindrome('A man, a plan, a canal: Panama.'))

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