得到一个完整的unicode senten

2024-10-04 01:33:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图解析一个类似Base: Lote Numero 1, Marcelo T de Alvear 500. Demanda: otras palabras.的句子。我想:首先,按句点分割文本,然后,使用冒号前面的任何内容作为冒号后面的句子的label。 现在我有以下定义:

from pyparsing import *

unicode_printables = u''.join(unichr(c) for c in xrange(65536) 
                                    if not unichr(c).isspace())

def parse_test(text):
    label = Word(alphas)+Suppress(':')
    value = OneOrMore(Word(unicode_printables)|Literal(','))
    group = Group(label.setResultsName('label')+value.setResultsName('value'))
    exp = delimitedList(
        group,
        delim='.'
    )

    return exp.parseString(text)

有点用,但它去掉了unicode字符(以及任何不在字母表中的字符),我想把value作为一个完整的句子,而不是这个:'value': [(([u'Lote', u'Numero', u'1', ',', u'Marcelo', u'T', u'de', u'Alvear', u'500'], {}), 1)。在

是解决这个问题的简单方法吗?在


Tags: textvalueunicodegroupdelabel句子word
2条回答

要直接回答您的问题,请用originalTextFor包装您的值定义,这将返回匹配标记来自的字符串片段,作为单个字符串。您还可以添加一个解析操作,例如:

value.setParseAction(lambda t : ' '.join(t))

但这将显式地在每个项之间放置一个空格,而此时可能没有空格(在单词后面有“,”)或多个空格。originalTextFor将给出精确的输入子字符串。但更简单的是,如果您只是阅读“:”之后的所有内容,则可以使用restOfLine。(当然,最简单的方法是使用split(':'),但我假设您是在专门询问如何使用pyparsing来实现这一点)

其他几点注意事项:

  • xxx.setResultsName('yyy')可以缩短为xxx('yyy'),从而提高解析器定义的可读性。

  • 将值定义为OneOrMore(Word(unicode_printables) | Literal(','))有几个问题。首先,','将包含在unicode_printables中的字符集中,因此''将与任何已解析的单词一起包含在中。解决这个问题的最好方法是使用excludeChars参数来Word,这样你的句子单词就不会包含逗号:OneOrMore(Word(unicode_printables, excludeChars=',') | ',')。现在您还可以排除其他可能的标点符号,如“;”、“-”等,只需将它们添加到excludeChars字符串中即可。(我刚刚注意到,您正在使用“.”作为delimitedList的分隔符-要使这一点起作用,您还必须将“.”包含在排除的字符中。)Pyparsing在这方面不像正则表达式-如果下一个字符继续匹配当前标记,它不会提前尝试匹配解析器中的下一个标记。这就是为什么你必须自己做一些额外的工作来避免阅读过多。一般来说,像OneOrMore(Word(unicode_printables))这样的开放式的东西很可能会耗尽输入字符串的其余部分。

您应该研究一下PyICU,它提供对ICU提供的富Unicode文本库的访问,包括提供句子查找器的BreakIterator类。在

相关问题 更多 >