Анализ строки ввода, пока не достигнет определенной буквы на Python - PullRequest
21 голосов
/ 17 ноября 2011

Мне нужна помощь в попытке написать определенную часть программы. Идея состоит в том, что человек будет вводить кучу тарабарщины, и программа будет читать ее, пока не достигнет "!" (восклицательный знак), например:

input("Type something: ")

Типы лиц: wolfdo65gtornado! Salmontiger223

Если я прошу программу напечатать ввод, она должна только напечатать wolfdo65gtornado и вырезать что-либо, как только достигнет "!" Остальная часть программы анализирует и считает буквы, но те части, которые я уже знаю, как сделать. Мне просто нужна помощь с первой частью. Я пытался просмотреть книгу, но, похоже, что-то упустил.

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

Если бы вы могли помочь, я буду действительно признателен. Спасибо!

Ответы [ 6 ]

39 голосов
/ 17 ноября 2011

Встроенный метод str.partition() сделает это за вас.В отличие от str.split() он не потрудится разрезать остальную часть str на различные str с.

text = raw_input("Type something:")
left_text = text.partition("!")[0]
11 голосов
/ 17 ноября 2011
>>> s = "wolfdo65gtornado!salmontiger223"
>>> s.split('!')[0]
'wolfdo65gtornado'
>>> s = "wolfdo65gtornadosalmontiger223"
>>> s.split('!')[0]
'wolfdo65gtornadosalmontiger223'

, если он не встречает символ "! ", он просто захватит весь текст. если вы хотите вывести ошибку, если она не соответствует ни одному «! », вы можете просто сделать так:

s = "something!something"
if "!" in s:
  print "there is a '!' character in the context"
else:
  print "blah, you aren't using it right :("
6 голосов
/ 17 ноября 2011

Вы хотите itertools.takewhile().

>>> s = "wolfdo65gtornado!salmontiger223"
>>> '-'.join(itertools.takewhile(lambda x: x != '!', s))
'w-o-l-f-d-o-6-5-g-t-o-r-n-a-d-o'



>>> s = "wolfdo65gtornado!salmontiger223!cvhegjkh54bgve8r7tg"
>>> i = iter(s)
>>> '-'.join(itertools.takewhile(lambda x: x != '!', i))
'w-o-l-f-d-o-6-5-g-t-o-r-n-a-d-o'
>>> '-'.join(itertools.takewhile(lambda x: x != '!', i))
's-a-l-m-o-n-t-i-g-e-r-2-2-3'
>>> '-'.join(itertools.takewhile(lambda x: x != '!', i))
'c-v-h-e-g-j-k-h-5-4-b-g-v-e-8-r-7-t-g'
4 голосов
/ 20 сентября 2013

Попробуйте это:

s = "wolfdo65gtornado!salmontiger223"
m = s.index('!')
l = s[:m]
0 голосов
/ 12 июля 2019

Объяснить принятый ответ.

Расщепление

partition() функция разбивает строку в списке на 3 элемента:

mystring = "123splitABC"
x = mystring.partition("split")
print(x)

даст:

('123', 'split', 'ABC')

Доступ к ним, как к элементам списка:

print (x[0]) ==> 123

print (x[1]) ==> split

print (x[2]) ==> ABC

0 голосов
/ 21 июня 2019

Мы можем использовать itertools

s = "wolfdo65gtornado!salmontiger223"
result = "".join(itertools.takewhile(lambda x : x!='!' , s))

>>"wolfdo65gtornado"
...