2014-03-04 57 views
0

自从我上次真正使用python以来,它已经有一段时间了。你如何标记用户输入?在Python中令牌化用户输入

比方说,例如: 用户输入:嘿,我的名字叫乔恩

标记生成器将根据空间

+3

你只是在寻找'str.split()'? – cmd

+0

类似的东西,但我希望它看起来像一个样子,所以在每个实例Tok将具有字符串中的字符的值。例如:当令牌不为空时,将该值推送到堆栈@cmd –

+0

看起来您希望我们为您编写一些代码。尽管许多用户愿意为遇险的编码人员编写代码,但他们通常只在海报已尝试自行解决问题时才提供帮助。证明这一努力的一个好方法是包含迄今为止编写的代码,示例输入(如果有的话),期望的输出和实际获得的输出(控制台输出,堆栈跟踪,编译器错误 - 无论是适用)。您提供的细节越多,您可能会收到的答案就越多。 –

回答

3

您可以使用正则表达式的组来标记一个字符串:

import re 

tokens = (
    ('STRING', re.compile('"[^"]+"')), # longest match 
    ('ID', re.compile('[a-zA-Z_]+')), 
    ('SPACE', re.compile('\s+')), 
    ('DIGIT', re.compile('\d+')), 
) 

def tokenizer(s): 
    i = 0 
    lexeme = [] 
    while i < len(s): 
    match = False 
    for token, regex in tokens: 
     result = regex.match(s, i) 
     if result: 
     lexeme.append((token, result.group(0))) 
     i = result.end() 
     match = True 
     break 
    if not match: 
     raise Exception('lexical error at {0}'.format(i)) 
    return lexeme 

以字符串abcd xvc 23432 "exampe" 366

for i in tokenizer('abcd xvc 23432 "exampe" 366'): 
    print i 

打印:

('ID', 'abcd') 
('SPACE', ' ') 
('ID', 'xvc') 
('SPACE', ' ') 
('DIGIT', '23432') 
('SPACE', ' ') 
('STRING', '"exampe"') 
('SPACE', ' ') 
('DIGIT', '366') 
+0

是的!这实际上是我在寻找的感谢! –

+0

如果我想在尝试添加之前检查令牌的类型让我们说什么。你是怎样做的? @BSH –

+0

@MannyO'isinstance(obj,type)'如果'obj'在任何地方继承'type',则返回'True'。备选地,只是检查第一索引在'i'(例如'I [0]'),并检查其对' “ID”',' “SPACE”',' “DIGIT”',或' “STRING”' –

0

使用拆分拆分它分割字符串

str.split() 
+0

是的,但让我们说有一个在那里的数字,我怎么单独指定它作为一个数字之前推它到堆栈@Amit –

0
> "Hey my name is Jon".split() - 
['Hey', 'my', 'name', 'is', 'Jon'] 

将是简单的答案。如果您有更复杂的令牌概念(例如,“Jon!”是1或2个令牌),请使用re.findall

> re.findall(r'(\d+)|(\w+)', 'Jon is 10 years old') 
[('', 'Jon'), ('', 'is'), ('10', ''), ('', 'years'), ('', 'old')] 

请注意,这会将数字放在每个元组左侧和其他字符串的右侧。这将做其他事情,你可能没有预料

> re.findall(r'(\d+)|(\w+)', 'Hi-yoo') 
[('', 'Hi'), ('', 'yoo')] 

查找一个很好的正则表达式教程了解更多。

+0

是的,但让我们说有一个数字在那里,如何在将它推入堆栈之前,我将它单独指定为一个数字@ U2EF1 –

+2

@MannyO可能类似'[int(token)if token.isdigit()else user_input.split()]中的标记' –

+0

@MannyO什么adsmith说,如果这变得越来越复杂,请查看如何使用正则表达式组。 – U2EF1

0

您可以使用str.split()做到这一点,但是删除了空格。如果您想保留空间,请使用list(str)