分析字符串输入,直到它到达Python上的某个字母

时间:2011-11-17 04:12:42

标签: python string input edit

我在尝试编写程序的某个部分时需要帮助。 这个想法是一个人会输入一堆乱码,程序会读到它直到达到“!” (感叹号)所以例如:

input("Type something: ")

人物类型:wolfdo65gtornado!salmontiger223

如果我要求程序打印输入,它应该只打印wolfdo65gtornado并在达到“!”时剪切任何内容。该计划的其余部分正在分析和计算字母,但那些部分我已经知道该怎么做了。我只需要第一部分的帮助。我一直在试图翻阅这本书,但似乎我错过了一些东西。

我在想,也许利用一个for循环,然后对它施加限制,但我无法弄清楚如何对随机估算的字符串输入进行分析以获得某个特征,然后摆脱休息。

如果你能提供帮助,我会非常感激。谢谢!

8 个答案:

答案 0 :(得分:38)

内置的str.partition()方法会为您完成此操作。与str.split()不同,它不会费心将str的其余部分剪切为不同的str

text = raw_input("Type something:")
left_text = text.partition("!")[0]

答案 1 :(得分:11)

>>> 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 :("

答案 2 :(得分:6)

你想要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'

答案 3 :(得分:4)

试试这个:

s = "wolfdo65gtornado!salmontiger223"
m = s.index('!')
l = s[:m]

答案 4 :(得分:0)

解释接受的答案。

分裂

partition()函数使用3个元素在列表中拆分字符串:

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

将给出:

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

访问,类似于列表元素:

print (x[0]) ==> 123

print (x[1]) ==>拆分

print (x[2]) ==> ABC

答案 5 :(得分:0)

假设我们有

s = "wolfdo65gtornado!salmontiger223" + some_other_string
如果s.partition("!")[0]包含一百万个字符串,每个字符串长一百万个字符,并用感叹号分隔,则

s.split("!")[0]some_other_string都是问题。我建议改为以下内容。效率更高。

import itertools as itts
get_start_of_string = lambda stryng, last, *, itts=itts:\
                          str(itts.takewhile(lambda ch: ch != last, stryng))
###########################################################
s = "wolfdo65gtornado!salmontiger223"
start_of_string = get_start_of_string(s, "!")

为什么itts=itts

get_start_of_string之类的函数主体内部,itts是全局的。
itts是在 称为 的函数中评估的,而不是在 定义 的函数中评估的。
考虑以下示例:

color = "white"
get_fleece_color = lambda shoop: shoop + ", whose fleece was as " + color + " as snow."

print(get_fleece_color("Igor"))

# [... many lines of code later...]

color = "pink polka-dotted"
print(get_fleece_color("Igor's cousin, 3 times removed"))

输出为:

Igor, whose fleece was white as snow.
Igor's cousin, 3 times removed Igor, whose fleece was as pink polka-dotted as snow.

答案 6 :(得分:0)

您可以使用正则表达式提取字符串的开头,直到遇到第一个定界符为止。

import re

slash_if_special = lambda ch:\
    "\\" if ch in "\\^$.|?*+()[{" else ""

prefix_slash_if_special = lambda ch, *, _slash=slash_if_special: \
    _slash(ch) + ch

make_pattern_from_char = lambda ch, *, c=prefix_slash_if_special:\
    "^([^" + c(ch) + "]*)"

def get_string_up_untill(x_stryng, x_ch):
    i_stryng = str(x_stryng)
    i_ch = str(x_ch)
    assert(len(i_ch) == 1)
    pattern = make_pattern_from_char(ch)
    m = re.match(pattern, x_stryng)
    return m.groups()[0]

上面使用的代码示例:

s = "wolfdo65gtornado!salmontiger223"
result = get_string_up_untill(s, "!")
print(result)
# wolfdo65gtornado

答案 7 :(得分:-1)

我们可以使用 itertools

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

>>"wolfdo65gtornado"