2016-01-30 7 views
1

Как я могу удалить первый и последний «i» из текста ввода? 1-й вариант удаляет текст последней буквы и дубликатов:Удалить первый и последний конкретный символ

Entered TexEntered Text 
     ^  ^

2-й вариант ничего не делает.

Код:

txt4 = input("Enter text: ") 
txt4 = txt4.swapcase() 
print(txt4) 
x = "I" or "i" 
x1 = txt4.find(x) 
x2 = txt4.rfind(x) 
if [x1, x2] == -1: 
    print("Letter \"i\" not found!") 
else: 
    #txt4 = txt4.replace(txt4[0:(x1+1)], "", 1) #] 
    #txt4 = txt4.replace(txt4[(x2):0], "", 1) #]-2nd variant 
    #txt4x1 = txt4[:(x1+1)] + txt4[(x2):]  #] 
    txt4x1 = txt4[0:x1]+txt4[(x1+1):] 
    txt4x1 = txt4[0:x2]+txt4[(x2+1):] 
    print(txt4x1) 
+0

https://docs.python.org/2/library/re.html#re.sub – zwol

+2

также, 'х =«Я»или«я»' не делать то, что вы думаете, что он делает. – zwol

+0

@zwol так, как это исправить? – Marius

ответ

2

Вы можете использовать регулярное выражение:

import re 
regex = re.compile('i', flags=re.IGNORECASE) 
txt = input("Enter text: ") 
# re.sub() always searches from left, so we reverse txt using slice [::-1] 
# to find the last match. Then we flip it again. 
txt = regex.sub('', txt[::-1], 1) 
txt = regex.sub('', txt[::-1], 1) 
print(txt) 

Другой, более короткий способ сделать то же самое.

txt = input("Enter text: ") 
for direction in 'from right', 'from left': # do it twice 
    txt = re.sub('[iI]', '', txt[::-1], count=1) 
print(txt) 
+1

Это лучшее решение. Надеюсь, мой пост показывает, где исходный код идет не так и как делать попытки, но для общей проблемы это способ сделать это. –

0

Как уже упоминалось в комментариях, вы пытаетесь сделать использование or и == со списком в том, как они просто не работают в Python.

Вам необходимо произвести проверку каждого символа в отдельности.

swappedCase = input("Enter text: ").swapcase() 
print(swappedCase) 
letters = {"I", "i"} 
leftPositions = {swappedCase.find(letter) for letter in letters} 
leftPos = min((position for position in leftPositions if position > -1), default=-1) 
rightPos = max(swappedCase.rfind(letter) for letter in letters) 
if leftPos > -1 or rightPos > -1: 
    altered = swappedCase 
    if leftPos > -1: 
     altered = altered[:leftPos]+txt4[leftPos+1:] 
    if rightPos > -1: 
     altered = altered[:rightPos]+txt4[rightPos+1:] 
    print(altered) 
else: 
    print("Letter \"i\" not found!") 

Вместо "I" or "i" (который просто всегда возвращает "I", потому что это первое True значение), мы делаем find() и rfind() для каждого из них (из набора), а затем найти минимальное значение, которого нет -1 и максимальное значение, чтобы найти самые левые и самые правые вхождения, тогда мы можем сделать замены, примерно так, как вы делали раньше.

Смежные вопросы