在特定字符之前打印字符串中的每个字符

时间:2016-11-20 00:27:42

标签: python string python-3.x

phrase='!_#@%'
pun=''
string='dj_khaled'
for item in string:
    if item not in phrase:
       pun=pun+item
print(pun)

我的问题是,我得到的输出是djkhaled而不是它应该是dj,所以基本上,我想在某个符号出现之前包含每个字符。字符串是alphanumberic。

3 个答案:

答案 0 :(得分:2)

只要某个字符不在pun中,您的循环就会添加到phrase,而应该检查字符是否在短语中并break相应。在此之前,您不断向pun添加字符:

for item in string:
    if item in phrase:
        break
    pun += item

执行后,现在可以正确打印"dj"

如果之前的方法不够,您还可以考虑takewhile itertools

>>> "".join(takewhile(lambda x: x not in phrase, string))
"dj"

另一种不使用break(?)的方法可以是使用一个布尔标志来指示phrase中的值是否被看到,然后你可以在决定时采取行动如果您应该添加到pun

phrase='!_#@%'
pun=''
string='dj!khaled'
seen = False
for item in string:
    if item in phrase:
       seen = True
    if not seen:
        pun += item
print(pun)

答案 1 :(得分:0)

使用index方法建立索引可以更轻松地完成此任务:

pun = string[:string.index(phrase)]
print(pun)

如果我们有多个“短语”,有些可能不在字符串中:

phrase=['_','j','z']

pun = string[:min([string.index(i) for i in phrase if i in string])]
print(pun)

答案 2 :(得分:0)

另一种方法是使用while循环

进行旧样式
forbidden ='!_#@%'
string='dj_khaled'
result =""
i = 0
while i<len(string) and string[i] not in forbidden:
    result = result + string[i]
    i = i+1
print( result )

但这更容易搞砸,但在功能上与在Jin的第一个例子中使用break相同。

以及我在评论中提到的功能版本

def myfun(string):
    forbidden ='!_#@%'
    result = ""
    for c in string:
        if c in forbidden:
            return result  #normally here you put the break
        result = result + c
    return result

print( myfun('dj_khaled') )