#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']
разве это не желаемый результат?