1

这是一个简单的扫描器,它根据某些规则对文本进行标记,并标记标记。

  1. 处理未知字符并将其标记为未知的最佳方法是什么?
  2. 是否有推荐的方法/库来加快速度,同时完成类似的结果并保持相对简单。

例子:

import re

def alpha(scanner,token):
    return token, 'a'

def numeric(scanner,token):
    return token,'rn'

def punctuation(scanner,token):
    return token, 'p'

def superscript(scanner,token):
    return token, 'sn'

scanner = re.Scanner([
    (u"[a-zA-Z]+", alpha),
    (u"[.,:;!?]", punctuation),
    (u"[0-9]+", numeric),
    (u"[\xb9\u2070\xb3\xb2\u2075\u2074\u2077\u2076\u2079\u2078]", superscript),
    (r"[\s\n]+", None), # whitespace, newline
    ])

tokens, _ = scanner.scan("This is a little test? With 7,9 and 6.")
print tokens

出去:

[('This', 'a'), ('is', 'a'), ('a', 'a'), ('little', 'a'), ('test', 'a'),
 ('?', 'p'), ('With', 'a'), ('7', 'rn'), (',', 'p'), ('9', 'rn'), 
 ('and', 'a'), ('6', 'rn'), ('.', 'p')]

ps!定义的函数可能会尝试进一步对标记进行分类。

4

1 回答 1

3

按照提供的re.Scanner顺序匹配模式。因此,您可以在最后提供一个非常通用的模式来捕获“未知”字符:

(r".", unknown)

import re

def alpha(scanner,token):
    return token, 'a'

def numeric(scanner,token):
    return token,'rn'

def punctuation(scanner,token):
    return token, 'p'

def superscript(scanner,token):
    return token, 'sn'

def unknown(scanner,token):
    return token, 'uk'

scanner = re.Scanner([
    (r"[a-zA-Z]+", alpha),
    (r"[.,:;!?]", punctuation),
    (r"[0-9]+", numeric),
    (r"[\xb9\u2070\xb3\xb2\u2075\u2074\u2077\u2076\u2079\u2078]", superscript),
    (r"[\s\n]+", None), # whitespace, newline
    (r".", unknown)
    ])

tokens, _ = scanner.scan("This is a little test? With 7,9 and 6. \xa0-\xaf")
print tokens

产量

[('This', 'a'), ('is', 'a'), ('a', 'a'), ('little', 'a'), 
('test', 'a'), ('?', 'p'), ('With', 'a'), ('7', 'rn'), (',', 'p'), 
('9', 'rn'), ('and', 'a'), ('6', 'rn'), ('.', 'p'), ('\xa0', 'uk'), 
('-', 'uk'), ('\xaf', 'uk')]

你的一些模式是unicode,一个是str。确实,在 Python2 中,要匹配的模式和字符串可以是unicodestr

但是,在 Python3 中

Unicode 字符串和 8 位字符串不能混合使用:也就是说,您不能将 Unicode 字符串与字节模式匹配,反之亦然

因此,即使在 Python2 中,也不要混合使用它们是一种很好的做法。


我认为您的代码非常简单(正则表达式除外superscript。Eek!)。我不知道有什么图书馆可以让它变得更简单。

于 2013-01-16T13:32:33.043 回答