Как оставить только одну определенную подстроку в строке в Python - PullRequest
0 голосов
/ 16 мая 2019

Скажем, у меня есть одна из строк:

"a b c d e f f g" || "a b c f d e f g"

И я хочу, чтобы во всей строке была только одна вхождение подстроки ( f ) во всей строке, чтобы онанесколько продезинфицировать.Результатом каждой строки будет:

"a b c d e f g" || "a b c d e f g"

Примером использования будет:

str = "a b c d e f g g g g g h i j k l"
str.leaveOne("g") 
#// a b c d e f g h i j k l

Ответы [ 3 ]

2 голосов
/ 16 мая 2019

Если неважно, какой экземпляр вы оставите, вы можете использовать str.replace, который принимает параметр, обозначающий количество замен, которые вы хотите выполнить:

def leave_one_last(source, to_remove):
    return source.replace(to_remove, '', source.count(to_remove) - 1)

Это оставит последнее вхождение.

Мы можем изменить его, чтобы оставить вхождение first , дважды изменив строку:

def leave_one_first(source, to_remove):
    return source[::-1].replace(to_remove, '', source.count(to_remove) - 1)[::-1]

Однако, это уродливо, но неупомянуть неэффективно.Более элегантный способ может заключаться в том, чтобы взять подстроку, которая заканчивается первым вхождением символа, найти, заменить его вхождения в остальных и, наконец, объединить их вместе:

def leave_one_first_v2(source, to_remove):
    first_index = source.index(to_remove) + 1
    return source[:first_index] + source[first_index:].replace(to_remove, '')

Если мы попробуем это:

string = "a b c d e f g g g g g h i j k l g"

print(leave_one_last(string, 'g'))
print(leave_one_first(string, 'g'))
print(leave_one_first_v2(string, 'g'))

Вывод:

a b c d e f      h i j k l g
a b c d e f g     h i j k l 
a b c d e f g     h i j k l 

Если вы не хотите оставлять пробелы, вам следует использовать версию на основе split:

def leave_one_split(source, to_remove):
    chars = source.split()
    first_index = chars.index(to_remove) + 1
    return ' '.join(chars[:first_index] + [char for char in chars[first_index:] if char != to_remove])

string = "a b c d e f g g g g g h i j k l g"

print(leave_one_split(string, 'g'))

Вывод:

'a b c d e f g h i j k l'
1 голос
/ 16 мая 2019

Учитывая String

mystr = 'defghhabbbczasdvakfafj'

cache = {}

seq = 0
for i in mystr:
    if i not in cache:
        cache[i] = seq
        print (cache[i])
        seq+=1

mylist = []

Здесь я заказал словарь со значениями

 for key,value in sorted(cache.items(),key=lambda x : x[1]):
        mylist.append(key)
 print ("".join(mylist))
1 голос
/ 16 мая 2019

Если я правильно понимаю, вы можете просто использовать регулярные выражения и re.sub, чтобы найти группы из двух или более ваших букв с пробелом или без него и заменить его одним экземпляром:

import re
def leaveOne(s, char):  
    return re.sub(r'((%s\s?)){2,}' % char, r'\1' , s)

leaveOne("a b c d e f g g g h i j k l", 'g') 
# 'a b c d e f g h i j k l'

leaveOne("a b c d e f ggg h i j k l", 'g')
# 'a b c d e f g h i j k l'

leaveOne("a b c d e f g h i j k l", 'g')
# 'a b c d e f g h i j k l'

EDIT

Если цель состоит в том, чтобы избавиться от всех вхождений буквы, кроме одного, вы все равно можете использовать регулярное выражение с заглядыванием, чтобы выбрать все буквы, за которыми следуют одинаковые:

import re
def leaveOne(s, char):  
    return re.sub(r'(%s)\s?(?=.*?\1)' % char, '' , s)

print(leaveOne("a b c d e f g g g h i j k l g", 'g'))
# 'a b c d e f h i j k l g'

print(leaveOne("a b c d e f ggg h i j k l gg g", 'g'))
# 'a b c d e f h i j k l g'

print(leaveOne("a b c d e f g h i j k l", 'g'))
# 'a b c d e f g h i j k l'

Это должно работать даже с более сложными шаблонами, такими как:

leaveOne("a b c ffff d e ff g", 'ff')
# 'a b c d e ff g'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...