2010-09-13 4 views
0

il est plus élégant (pythonic + effectif) façon de trouver le mot sur une position donnée?Trouver le mot sur la position donnée dans le texte

FIRST_WORD = re.compile(r'^(\w+)', re.UNICODE) 
LAST_WORD = re.compile(r'(\w+)$', re.UNICODE) 

def _get_word(self, text, position): 
    """ 
    Get word on given position 
    """ 
    assert position >= 0 
    assert position < len(text) 

    # get second part of word 
    # slice string and get first word 
    match = FIRST_WORD.search(text[position:]) 
    assert match is not None 
    postfix = match.group(1) 

    # get first part of word, can be empty 
    # slice text and get last word 
    match2 = LAST_WORD.search(text[:position]) 
    if match2 : prefix = match2.group(1) 
    else : prefix = '' 

    return prefix + postfix 


#         | 21. 
>>> _get_word("Hello, my name is Earl.", 21) 
Earl 
>>> _get_word("Hello, my name is Earl.", 20) 
Earl 

Merci

Répondre

1

Voici comment je le ferais:

s = "Hello, my name is Earl." 
def get_word(text, position): 
    words = text.split() 
    characters = -1 
    for word in words: 
     characters += len(word) 
     if characters > = position: 
      return word 
>>> get_word(s, 21) 
Earl. 

dépouillant la ponctuation peut être fait avec ''.strip() ou des expressions régulières ou quelque chose aki comme

for c in word: 
    final += c if c.lower() in 'abcdefghijklmnopqrstuvwxyz' 
0
import string 

s = "Hello, my name is Earl." 
def get_word(text, position): 
    _, _, start = text[:position].rpartition(' ') 
    word,_,_ = text[position:].partition(' ') 
    return start+word 

print get_word(s, 21).strip(string.punctuation) 
0

La solution suivante est d'obtenir les caractères alpha autour de la position donnée:

def get_word(text, position): 
    if position < 0 or position >= len(text): 
     return '' 

    str_list = [] 

    i = position 
    while text[i].isalpha(): 
     str_list.insert(0, text[i]) 
     i -= 1 

    i = position + 1 
    while text[i].isalpha(): 
     str_list.append(text[i]) 
     i += 1 

    return ''.join(str_list) 

Ce qui suit est un test:

get_word("Hello, my name is Earl.", 21) # 'Earl' 
get_word("Hello, my name is Earl.", 20) # 'Earl' 

Je ne pense pas que ce soit une bonne idée de scinder le texte en mots avec la fonction split ici, car la position est essentielle pour ce problème. S'il y a des espaces continus dans un texte, la fonction split peut provoquer des problèmes.

Questions connexes