循环一个字符串,只返回某些字符。蟒蛇

时间:2017-09-24 11:14:27

标签: python

创建一个应该首先返回小写字母“_”和“。”的函数时遇到问题。然后是大写字母,“”和“|”以该顺序。我的版本似乎返回数字和特殊字符,例如&lt;&gt; @,我不想让它做,它只应该读取输入字符串一次,我不知道是否用我的代码实现了。< / p>

我的代码是:

def split_iterative(n):
    splitted_first = ""
    splitted_second = ""
    for i in n:
        if i == i.lower() or i == "_" or i == ".":
            splitted_first = splitted_first + i
        elif i == i.upper() or i == " " or i == "|":
            splitted_second = splitted_second + i
    return splitted_first + splitted_second

如果我执行plit_iterative("'lMiED)teD5E,_hLAe;Nm,0@Dli&Eg ,#4aI?rN@T§&e7#4E #<(S0A?<)NT8<0'")),则返回"'li)te5,_he;m,0@li&g ,#4a?r@§&e7#4 #<(0?<)8<0'MEDDELANDEINTESANT"这是不正确的,因为它应该消除所有这些特殊字符和数字。我该如何解决?它应该返回('lite_hemligare', 'MEDDELANDE INTE SANT')

5 个答案:

答案 0 :(得分:1)

你可以试试这个:

def f(input_string):
    str1 = str2 = ""
    for character in input_string:
        if character.isalpha():
            if character.islower():
                str1 += character
            else:
                str2 += character
        elif character in "_.":
            str1 += character
        elif character in " |":
            str2 += character
    return str1, str2

输出:

>>> input_string = "'lMiED)teD5E,_hLAe;Nm,0@Dli&Eg ,#4aI?rN@T§&e7#4E #<(S0A?<)NT8<0'"
>>> 
>>> print f(input_string)
('lite_hemligare', 'MEDDELANDE INTE SANT')
>>> 

答案 1 :(得分:1)

这是因为你正在迭代一个字符串。特殊字符的小写字母与字符相同。即.. '#'.lower() == '#'。因此,它将返回#&#39;#&#39;和所有其他特殊字符。你应该在字符串上使用isalpha()方法显式检查字母表。 (i.isalpha() and i.lower() == i) or i == '_' or i == '.'

答案 2 :(得分:0)

您可以使用ASCII值过滤字符:

def split_iterative(n):
    splitted_first = ""
    splitted_second = ""
    for i in n:
        if ord(i) in range(97,122) or i == "_" or i == ".":
            splitted_first = splitted_first + i
        elif ord(i) in range(65,90) or i == " " or i == "|":
            splitted_second = splitted_second + i
    return (splitted_first , splitted_second)

答案 3 :(得分:0)

首先,要让它返回一个列表,不要返回连接的字符串,而是列表

其次,您没有检查或过滤掉字符,一种方法是使用isalpha()方法检查字符是否为字母

类似的东西:

def split_iterative(n):
splitted_first = ""
splitted_second = ""
for i in n:
    if (i.isalpha() and i == i.lower()) or i == "_" or i == ".":
        splitted_first = splitted_first + i
    elif (i.isalpha() and i == i.upper()) or i == " " or i == "|":
        splitted_second = splitted_second + i
#returns a list you can make it a variable if you need
return [splitted_first, splitted_second] 

答案 4 :(得分:0)

您可以在浏览文字字符时使用两个列表。

您可以将小写,下划线和停止字符附加到一个列表,然后将大写,空格和管道字符附加到另一个列表。

最后返回作为字符串连接的每个列表的元组。

def splittext(txt):
  slug, uppercase_letters = [], []
  slug_symbols = {'_', '.'}
  uppercase_symbols = {' ', '|'}

  for letter in txt:
    if letter.islower() or letter in slug_symbols:
      slug.append(letter)
    if letter.isupper() or letter in uppercase_symbols:
      uppercase_letters.append(letter)

  return ''.join(slug), ''.join(uppercase_letters)


txt="'lMiED)teD5E,_hLAe;Nm,0@Dli&Eg ,#4aI?rN@T§&e7#4E #<(S0A?<)NT8<0'"
assert splittext(txt) == ("lite_hemligare", "MEDDELANDE INTE SANT")