在Python中对用户输入进行标记

时间:2014-03-04 23:16:20

标签: python

自从我上次使用python以来已经有一段时间了。你如何标记用户输入?

让我们举例说: 用户输入:嘿,我叫Jon,

Tokenizer将根据空格

拆分它

4 个答案:

答案 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')

答案 1 :(得分:0)

使用split来分割字符串

str.split()

答案 2 :(得分: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')]

查看一个很好的正则表达式教程以了解更多信息。

答案 3 :(得分:0)

您可以使用str.split()执行此操作,但这会删除空格。如果您想保留空格,请使用list(str)