我在尝试一个挑战,我成功了,但有一次它没有按照我想要的方式工作。
这里有一个挑战:给定一个字符串,返回它是否构成回文,忽略大小写和非字母字符。 注意:回文是向前和向后读数相同的字符序列。 例:给定以下字符串。。。 “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方法根本不存在一样,它基本上不移除非字母字符,而它应该。。。 所以,在这里,我开始知道我可能做错了什么,以及我是否可能得到别人的帮助,因为我已经在这上面困了一天了。
谢谢大家阅读这篇文章!
首先,您的正则表达式将删除大写字母。 即使修改了正则表达式以删除非大小写字母,也会在下一行代码中删除结果(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