在Python中对用户输入进行分词

0 投票
4 回答
2510 浏览
提问于 2025-04-17 20:52

我已经有一段时间没真正用过Python了。怎么把用户输入的内容分词呢?

比如说,用户输入的是:嘿,我的名字是Jon

分词器会根据空格把这句话拆开。

4 个回答

0

你可以用 str.split() 这个方法来实现这个功能,不过这样会把空格去掉。如果你想保留空格的话,可以使用 list(str)

0

使用split来分割字符串

str.split()
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

你可以用一组正则表达式来把一个字符串分割成小块:

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

撰写回答