2013-04-29 2 views
3

Интересно, что я делаю неправильно здесь. Может быть, кто-то может дать мне намек на эту проблему. Я хочу обнаружить определенные маркеры, используя pyparsing, которые заканчиваются строкой _Init.Pyparsing: обнаружение жетонов с определенным концом

В качестве примера, я следующие строки хранятся в text

one 
two_Init 
threeInit 
four_foo_Init 
five_foo_bar_Init 

Я хочу, чтобы извлечь следующие строки:

two_Init 
four_foo_Init 
five_foo_bar_Init 

В настоящее время, я сократил свою задачу следующим направлениям:

import pyparsing as pp 

    ident = pp.Word(pp.alphas, pp.alphanums + "_") 
    ident_init = pp.Combine(ident + pp.Literal("_Init")) 

    for detected, s, e in ident_init.scanString(text): 
     print detected 

Использование этого кода не имеет результатов. Если я удалю "_" в инструкции Word, то я могу обнаружить, по крайней мере, линии, имеющие _Init на своих концах. Но результат не завершен:

['two_Init'] 
['foo_Init'] 
['bar_Init'] 

У кого-нибудь есть идеи, что я делаю совершенно неправильно здесь?

ответ

2

Проблема в том, что вы хотите принять '_', если это не «_» в терминале «_Init». Вот два решения pyparsing, один более «чистый» pyparsing, другой просто говорит черт с ним и использует встроенное регулярное выражение.

samples = """\ 
one 
two_Init 
threeInit 
four_foo_Init 
six_seven_Init_eight_Init 
five_foo_bar_Init""" 


from pyparsing import Combine, OneOrMore, Word, alphas, alphanums, Literal, WordEnd, Regex 

# implement explicit lookahead: allow '_' as part of your Combined OneOrMore, 
# as long as it is not followed by "Init" and the end of the word 
option1 = Combine(OneOrMore(Word(alphas,alphanums) | 
          '_' + ~(Literal("Init")+WordEnd())) 
        + "_Init") 

# sometimes regular expressions and their implicit lookahead/backtracking do 
# make things easier 
option2 = Regex(r'\b[a-zA-Z_][a-zA-Z0-9_]*_Init\b') 

for expr in (option1, option2): 
    print '\n'.join(t[0] for t in expr.searchString(samples)) 
    print 

Оба варианта печати:

two_Init 
four_foo_Init 
six_seven_Init_eight_Init 
five_foo_bar_Init 
Смежные вопросы