如何从python中的字符串中删除子字符串?

时间:2014-09-30 03:10:42

标签: python

如何删除这些字符串中“Johnson”之前和之后的全部小写字母?

str1 = 'aBcdJohnsonzZz'
str2 = 'asdVJohnsonkkk'

预期结果如下:

str1 = 'BJohnsonZ'
str2 = 'VJohnson'

5 个答案:

答案 0 :(得分:3)

str.partition()是你的朋友:

def munge(text, match):
    prefix, match, suffix = text.partition(match)
    prefix = "".join(c for c in prefix if not c.islower())
    suffix = "".join(c for c in suffix if not c.islower())
    return prefix + match + suffix

使用示例:

>>> munge("aBcdJohnsonzZz", "Johnson")
'BJohnsonZ'
>>> munge("asdVJohnsonkkk", "Johnson")
'VJohnson'

答案 1 :(得分:3)

你可以对字符串进行分区,检查它是否有分隔符,而不是翻译小写字母,例如:

from string import ascii_lowercase as alc

str1 = 'aBcdJohnsonzZz'
p1, sep, p2 = str1.partition('Johnson')
if sep:
    str1 = p1.translate(None, alc) + sep + p2.translate(None, alc)
print str1

答案 2 :(得分:0)

不是很简单或简化,但你可以做这种事情(部分基于零比雷埃夫斯)

(编辑以反映错误)

def remove_lower(string):
    return ''.join(filter(str.isupper, string))

def strip_johnson(input_str):
    prefix, match, postfix = input_str.partition("Johnson")
    return (
        remove_lower(prefix) +
        match +
        remove_lower(postfix)
    )

答案 3 :(得分:0)

有几种方法可以解决这个问题。这是我能想到的最简单的一个。这个想法是分三个部分来解决它。首先,你需要知道中间的字符串。在你的情况下,约翰逊。'然后你可以删除之前和之后部分的小写字母。

def removeLowercaseAround(full, middle):
    stop_at = full.index(middle) #the beginning of the name
    start_again = stop_at+len(middle) #the end of the name
    new_str = ''; #the string we'll return at the end

    for i in range(stop_at): #for each char until the middle starts
        if not full[i].islower(): #if it is not a lowercase char
            new_str += full[i] #add it to the end of the new string

    new_str+=middle #then add the middle char

    for i in range(start_again, len(full)): #do the same thing with the end
        if not full[i].islower(): #if it is not a lowercase char
            new_str += full[i] #add it to the string
    return new_str

print removeLowercaseAround('ABcdJohnsonzZZ', 'Johnson')

答案 4 :(得分:0)

import re
def foo(input_st, keep_st):
    parts = input_st.split(keep_st)
    clean_parts = [re.sub("[a-z]*", "", part) for part in parts]
    return keep_st.join(clean_parts)

使用分区模块的其他方法似乎没有考虑重复的触发词。这个例子适用于你有'aBcJohnsonD​​eFJohnsonHiJkL'的情况,如果你担心这个特殊情况。