Python 根据特定要求重新排列字符串

Python 根据特定要求重新排列字符串,python,list,Python,List,大家好,我想用def、find等简单的东西来构建这个python函数。到目前为止,我知道如何获取代码的第一部分 给定一个字符串,如“HELLODOGMEMEDOGPAPA”,我需要返回一个列表,该列表提供三个内容: 单词dog之前的所有内容,我将表示为before\u dog 单词dog直到dog再次出现dog\u todog 狗第二次出现后的所有内容都将用after_todog表示 该列表的格式为[在狗之前、狗之后、狗之后] 例如,给定(“HELLODOGMEMEDOGPAPADD”),它将返

大家好,我想用def、find等简单的东西来构建这个python函数。到目前为止,我知道如何获取代码的第一部分

给定一个字符串,如“HELLODOGMEMEDOGPAPA”,我需要返回一个列表,该列表提供三个内容:

单词dog之前的所有内容,我将表示为before\u dog 单词dog直到dog再次出现dog\u todog 狗第二次出现后的所有内容都将用after_todog表示 该列表的格式为[在狗之前、狗之后、狗之后]

例如,给定(“HELLODOGMEMEDOGPAPADD”),它将返回列表 (“你好”,“狗迷”,“狗爸爸”)

另一个例子是(“HeyHellomandogdody”),它将返回列表 (“你好”、“狗”、“狗爸爸”)

但如果我有(“HeyHellododdy”) 输出将是(“HEYHELLO”、“dogdady”、“dogdady”)

此外,如果dog从未出现(“HEYHELLOYO”),则输出将为(“HEYHELLOYO,”,“”)

这就是我到目前为止所做的:

def split_list(words):
    # declare the list
    lst = []
    # find the first position
    first_pos=words.find("DOG")
    # find the first_pos
    before_dog = words [0:first_pos]
    lst.append(before_dog)
    return lst

有趣的函数
split_2_dogs()
re.findall()
函数:

import re

def split_2_dogs(s):
    if s.count('DOG') == 2:   # assuring 2 dogs are "walking" there
        return list(re.findall(r'^(.*)(DOG.*)(DOG.*)$', s)[0])

print(split_2_dogs("HELLODOGMEMEDOGPAPADD"))
print(split_2_dogs("HEYHELLOMANDOGYDOGDADDY"))
输出:

['HELLO', 'DOGMEME', 'DOGPAPADD']
['HEYHELLOMAN', 'DOGY', 'DOGDADDY']

具有
str.index()
str.rfind()
函数的替代解决方案:

def split_2_dogs(s):
    if 'DOG' not in s: return [s,'']
    pos1, pos2 = s.index('DOG'), s.rfind('DOG')
    return [s[0:pos1], s[pos1:pos2], s[pos2:]]

DOG
处拆分是关键!!此代码适用于您提到的所有情况

from itertools import izip_longest

words = 'HEYHELLODOGDADDY'
words = words.split("DOG")
words = ['DOG'+j if i>0 else j for i,j in enumerate(words)]
# words = ['HEYHELLO', 'DOGDADDY']
ans = ['','','']
# stitch words and ans together
ans = [m+n for m,n in izip_longest(words,ans,fillvalue='')]

print ans
输出:

['HEYHELLO', 'DOGDADDY', '']

使用该函数很容易做到这一点。例如,您可以使用分隔符拆分任何字符串,如dog,如下所示:

>>> chunks = 'HELLODOGMEMEDOGPAPA'.split('DOG')
>>> print(chunks)
['HELLO', 'MEME', 'PAPA']
然后,您可以在中使用它的输出,如下所示:

>>> dog_chunks = chunks[:1] + ["DOG" + chunk for chunk in chunks[1:]]
>>> print(dog_chunks)
['HELLO', 'DOGMEME', 'DOGPAPA']

唯一稍微棘手的一点是确保不要将dog预加到列表中的第一个字符串,因此在“dog”处拆分字符串,并使用条件来获得所需的结果

s = 'HELLODOGMEMEDOGPAPADD'
l = s.split('DOG')
dl = ['DOG'+i for i in l[1:]]
[l[0]]+dl if l[0] else dl
输出:

['HELLO', 'DOGMEME', 'DOGPAPADD']

它是否应该区分大小写?否不必区分大小写投票给doggos n Puppers到目前为止你所拥有的有什么问题?它返回了什么?这与你期望它返回的有什么不同?如果你用文字写下解决这个问题的步骤,这将很有帮助。如果你这样做,你将看到你已经实现了一些t你在这里给出的代码中的步骤。你也会看到你缺少了一些完成这项工作的步骤。有没有可能在没有任何ifs的情况下完成这项工作,而只是切片或导入。那么,如果我希望狗第一次出现时总是在列表的第二部分,即使狗只出现过一次,我该怎么做呢给定的字符串?@KirusanS,看到我在第二次接近中的最后更新了吗?如果狗没有第二次出现,我会怎么做?然后我只得到一个error@KirusanS所以你是说对于
HELLODOGPAPA
来说,答案应该是
('HELLO','DOGPAPA','')
是的,这就是它应该是的,如果字符串DOG再次出现,那么包括第二次出现的DOG之后的所有内容都将是列表的第三部分。您知道仅使用字符串的查找和切片功能是否可以实现这一点吗?@KirusanS首先告诉我,您想使用
split()吗
还是不?