Удалить определенные слова из конца строки

#python #string #replace

#python #строка #заменить

Вопрос:

Я пытаюсь удалять определенные слова из конца строк до тех пор, пока в конце строк больше не останется ни одного из этих слов.

Я попробовал следующее:

 companylist=['dell inc corp', 'the co dell corp inc', 'the co dell corp inc co']

def rchop(thestring, ending):
  if thestring.endswith(ending):
    return thestring[:-len(ending)]
  return thestring

for item in companylist:
    item = rchop(item,' co')
    item = rchop(item,' corp')
    item = rchop(item,' inc')
  

Я ожидаю следующих результатов:

 dell
the co dell
the co dell
  

Но вместо этого я получаю эти результаты:

 dell
the co dell corp
the co dell corp
  

Как мне сделать так, чтобы результаты не зависели от порядка слов замены, чтобы мои результаты представляли собой исчерпание всех слов замены с конца строк?

Комментарии:

1. Что такое rchop ? Это функция, которую вы создали? Пожалуйста, добавьте код для этого, если вы это сделали?

2. напишите rchop с помощью или

3. ok включил rchop def в мою правку

4. Почему вы говорите «конец» строки, когда, кажется, хотите удалить слова из любого места в ней? (в соответствии с вашим ожидаемым результатом)

5. нигде в моем ожидаемом выводе я не предполагал, что хочу удалить что-либо из строки. В любом случае, я исправил примеры, чтобы было более понятно, чего я хочу

Ответ №1:

Вы можете использовать это, чтобы удалить последнее слово, если оно есть в списке других слов:

 import re

string = "hello how are you"
words_to_remove = ["are", "you"]

space_positions = [x.start() for x in re.finditer(' ', string)]
print(space_positions)
for i in reversed(space_positions):
    if string[i 1:] in words_to_remove:
        string = string[:i]

print(string)
  

Который выводит:

 [5, 9, 13]
hello how
  

Если вас интересует только удаление последнего слова, независимо от того, что это такое, вы можете использовать это:

 import re

string = "hello how are you?"

space_positions = [x.start() for x in re.finditer(' ', string)]
print(space_positions)
for i in reversed(space_positions):
    print(string[:i], '---', string[i:])
  

Который выводит:

 [5, 9, 13]
hello how are ---  you?
hello how ---  are you?
hello ---  how are you?
  

string[:i] Часть — это все, что находится перед i-м пробелом, в то время как string[i:] часть — это все, что находится после i-го пробела.

Комментарии:

1. Тьфу, вы совершенно неправильно понимаете вопрос, OP задает что-то совершенно другое

2. Я вижу, так что это не удаляет какие-либо слова, это удаляет определенные слова. Название вопроса могло бы быть лучше.

3. Обновлено, чтобы лучше ответить на вопрос.

4. это работает отлично =). Извините за путаницу, возникшую ранее

Ответ №2:

Используя регулярное выражение.

Пример:

 import re

companylist=['dell inc corp', 'co dell corp inc', 'co dell corp inc co']
for i in companylist:
    print(re.sub(r"W(corp|inc|co)b", "", i))
  

Вывод:

 dell
co dell
co dell
  

Комментарии:

1. Я обновил свой вопрос более подходящим объяснением. ‘the co dell corp inc’ стал бы ‘the dell’ в вашем примере, когда я хотел сохранить ‘ co’ в этой строке, поскольку, как только corp и inc удалены с конца, последнее слово в строке больше не совпадает со словами, которые я пытаюсь удалить

Ответ №3:

Вы должны использовать:

 companylist = ['dell inc corp', 'co dell corp inc', 'co dell corp inc co']
for idx, item in enumerate(companylist):
    companylist[idx] = item.replace(' co', '')
    companylist[idx] = item.replace(' corp', '')
    companylist[idx] = item.replace(' inc', '')
  

Или благодаря @RoadRunner:

 companylist = [item.replace(' co', '').replace(' corp', '').replace(' inc', '') for item in companylist]
  

И теперь оба случая:

 print(companylist)
  

Является:

 ['dell', 'co dell', 'co dell']
  

Комментарии:

1. Также можно просто создать новый список с помощью [item.replace(' co', '').replace(' corp', '').replace(' inc', '') for item in companylist] .

Ответ №4:

Другой способ сделать это:

 companylist=['dell inc corp', 'co dell corp inc', 'co dell corp inc co']    
repList = [' inc',' corp',' corp inc']   # list of all the chars to replace  

for elem, s in zip(repList, companylist):
    print(s.partition(elem)[0])
  

ВЫВОД:

 dell
co dell
co dell
  

Редактировать:

Используя list comprehension :

 print([s.partition(elem)[0] for (elem,s) in zip(repList,companylist)])
  

ВЫВОД:

 ['dell', 'co dell', 'co dell']
  

Комментарии:

1. Я обновил свой вопрос более подходящим объяснением. ‘the co dell corp inc’ стал бы ‘the dell’ в вашем примере, когда я хотел сохранить ‘ co’ в этой строке, поскольку, как только corp и inc удалены с конца, последнее слово в строке больше не совпадает со словами, которые я пытаюсь удалить

2. @michael даже с вашим обновленным списком, companylist=['dell inc corp', 'the co dell corp inc', 'the co dell corp inc co'] он возвращает ['dell', 'the co dell', 'the co dell'] разве это не желаемый результат?