Получите целое предложение в Юникоде

Я пытаюсь разобрать предложение типа 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).

Есть простой способ решить эту проблему?


person tutuca    schedule 06.10.2011    source источник
comment
Я думаю, что в этом Как ответить [1] Пола Макгуайра есть то, что вы хотите. [1]: stackoverflow.com/questions/2339386/   -  person Ehtesh Choudhury    schedule 06.10.2011
comment
Отлично, это поможет мне разобраться с юникодами в моем определении, но не даст мне всего предложения в целом, верно?   -  person tutuca    schedule 06.10.2011
comment
Ага. Это шаг в правильном направлении, верно? Поэтому вместо Word(alphanums) вы бы позвонили Word(unicodePrintables)   -  person Ehtesh Choudhury    schedule 06.10.2011
comment
Отредактировал вопрос, чтобы отразить это.   -  person tutuca    schedule 06.10.2011


Ответы (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)), скорее всего, съест всю оставшуюся часть вашей входной строки.

person PaulMcG    schedule 06.10.2011

Вам следует изучить PyICU, который предоставляет доступ к предоставленной богатой текстовой библиотеке Unicode. от ICU, включая класс BreakIterator, который предоставляет средство поиска предложений.

person Mike Sokolov    schedule 06.10.2011
comment
Интересно, попробую провести тест с PyICU и посмотреть, подходит ли он. - person tutuca; 06.10.2011