Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么删除字符串中非字母字符的正则表达式函数不起作用?_Python_Python 3.x_Regex_Function_Methods - Fatal编程技术网

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

Python 为什么删除字符串中非字母字符的正则表达式函数不起作用?,python,python-3.x,regex,function,methods,Python,Python 3.x,Regex,Function,Methods,我正在尝试挑战,我成功了,但有一次没有达到我想要的效果 这里的挑战是:给定一个字符串,返回它是否形成回文,忽略大小写和非字母字符。注意:回文是向前和向后读取相同内容的字符序列。例:给定以下字符串。。。“水平”,返回真“算法”,返回假“一个人,一个计划,一条运河:巴拿马”,返回真 这是我的代码: import re def isPalindrome(str): reversedString = re.sub(r'[^a-z]', '', str) reversedString

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

这里的挑战是:
给定一个字符串,返回它是否形成回文,忽略大小写和非字母字符。注意:回文是向前和向后读取相同内容的字符序列。例:给定以下字符串。。。“水平”,返回真“算法”,返回假“一个人,一个计划,一条运河:巴拿马”,返回真

这是我的代码:

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方法根本不存在一样运行,它基本上不会删除非字母字符,而它应该。。 所以,在这里我开始知道我可能做错了什么,如果我有可能得到别人的帮助,因为我已经被困在这一天了


谢谢大家阅读这篇文章

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

您当前的方法有几个问题,在替换非字母数字字符后将主
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)
        
isPalindrome('A man, a plan, a canal: Panama.')
工作演示:

您可以使用
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

不要使用
str
作为变量名,您正在隐藏内置的
str()
提示:您在哪里忽略大小写?这里有几个问题:1)您的正则表达式不包含大写字母。所以在巴拿马的例子中,它去掉了大写的“P”。2) 添加print语句以查看reversedString变量发生了什么-应用正则表达式的行实际上没有做任何事情。如果你开始用更多的打印进行调试并解决这个案例问题,我想你会找到答案的!是的,我确实尝试过调试并找到了一些可能的解决方案,谢谢你们的帮助,真的帮助了我。@marw4ne注意,用现有的内置名称命名变量是一种不好的做法。现在一切都有意义了,非常感谢你们的帮助!看,也就是说你可以“接受”答案。哦,好吧,我刚刚意识到我可以做到,就做到了!再次感谢!忽略大小写和非字母字符为什么要包含数字?为什么在函数不返回任何内容时打印函数?