所以我在这里尝试将字符串' ABcsad f!,'
转换为
字符串'abcsadf'
,
所以基本上我想将空格和非Alpha替换为''
但是我的代码根本不起作用...
s = ' ABcsad f!,'
def norm(s):
b=''
i=0
for i in range(0,len(s)+1):
if (s[i].isalpha() is False) or (s[i].isspace() is False) :
return b+=''
else:
return b+=s[i]
i = i+1
print(norm(s))
任何人都可以告诉我我哪里出了错?
答案 0 :(得分:5)
尝试一下:
s = ' ABcsad f!,'
def norm(s):
return ''.join(i for i in s.lower() if i.isalpha())
print(norm(s))
输出:
'abcsadf'
答案 1 :(得分:4)
这是您出问题的地方
您将返回值放在for循环中。 Return退出整个norm
函数,而不是让for循环结束。它需要移到外面。
len(s) + 1
导致超出范围的错误。应该只是len(s)
要删除空格时,应检查s[i].isspace()
是否为真。
如果您希望所有内容都小写,则需要将s[i]
改成s[i].lower()
您可以使用b += ...
,但不能在其自己的return语句中使用它。无论如何都没有关系,因为您不应该在那儿使用return。
def norm(s):
b=''
for i in range(0,len(s)):
if (s[i].isalpha() is False) or (s[i].isspace() is True):
b += ""
else:
b += s[i].lower()
i = i+1
return b
s = ' ABcsad f!,'
print(norm(s))
答案 2 :(得分:2)
可能使用正则表达式:
import re
mystring = ' ABcsad f!,'
print (re.sub('[^A-Za-z0-9]+', '', mystring)).lower()
输出:
abcsadf
答案 3 :(得分:1)
问题在于,您的代码有错误,因为您试图在无效位置返回b
。
您的代码
return b+=''
python中的在Java之类的语言中无法正常工作。您必须显式返回b
。
尽管这不是最好的方法,但是只是尝试使用与您编写的代码相同的代码,但是使用的是正确的方法(不是pythonian的方法;-))
s = ' ABcsad f!,'
def norm(s):
b=''
i=0
for i in range(0, len(s)):
if not s[i].isalpha() or s[i].isspace():
b += ''
else:
b += s[i]
i = i+1
return b
print(norm(s))
还有更多类似regex的方法,使用replace操作可以在python中更有效地执行此操作。希望你能弄错。
答案 4 :(得分:0)
您在第一次迭代后返回了b
。不管第一个字符是什么,您都返回了b
,它没有让循环遍历您的字符串。因此,您需要使return b
处于循环状态。并且也不需要return b+=s[i]
。只要return b+s[i]
就可以了。实际上,您不能在return语句中分配值。但是,可以像下面这样缩短代码:
s = ' ABcsad f!,'
def norm(s):
b=''
i=0
for i in range(0, len(s)):
if s[i].isalpha():
b+=s[i]
return b.lower()
print(norm(s))