2010-11-30 9 views
0

J'ai une chaîne de caractères et je veux la rechercher pour un mot-clé ou une phrase et retourner seulement une partie du texte avant et après le mot-clé ou la phrase. Google fait exactement ce dont je parle.python tronquer le texte du mot-clé

Voici une chaîne que je saisis à partir du Web:

« Ce filtre tronque mots comme les mots TRUNCATE d'origine filtre Django, mais au lieu d'être basé sur le nombre de mots, il est basé sur le nombre de caractères J'en ai trouvé la nécessité lors de la construction d'un site web où je devais afficher des étiquettes sur de très petites zones de texte et tronquer par des mots ne me donnait pas toujours les meilleurs résultats (et tronquer par caractère est ... bien ... pas si élégant). "

Maintenant, supposons que je veux chercher ce pour la phrase building a website et puis quelque chose sortie comme ceci:

"... la nécessité de quand la construction d'un site où je dois montrer ... "

Editer: J'aurais dû rendre cela plus clair. Cela doit fonctionner sur plusieurs chaînes/phrases, pas seulement celle-ci.

+1

qui est presque un kwic (mot clé (s) dans le contexte) Résultat –

+0

Merci pour terme, je savais que je ne cherchais pas la bonne chose. – imns

Répondre

1

Utilisez une méthode qui obtient l'index de la phrase que vous souhaitez, puis découpez la chaîne jusqu'à N caractères avant et après cet index. Vous pourriez avoir envie de chercher les espaces les plus proches de N caractères de chaque côté de l'index, de sorte que vous obtenez des mots entiers.

fonctions de chaîne Python pour trouver ceux dont vous avez besoin:

http://docs.python.org/py3k/library/strings.html

0
>>> re.search(r'((?:\S+\s+){,5}\bbuilding a website\b(?:\s+\S+){,5})', s).groups() 
("the need for this when building a website where i'd have to show",) 
0

Quelque chose comme ça peut-être:

import re 
mo = re.search(r"(.{25})\bbuilding a website\b(.{25})", text) 
if mo: 
    print mo.group(1), "<b>building a website</b>", mo.group(2) 
1

Sur la base des réponses des autres (en particulier cababunga 's) I comme une fonction, qui prendra jusqu'à 25 (ou plusieurs) caractères, en s'arrêtant à la limite du dernier mot, et fournir une belle correspondance:

import re 

def find_with_context(haystack, needle, context_length, escape=True): 
    if escape: 
     needle = re.escape(needle) 
    return re.findall(r'\b(.{,%d})\b(%s)\b(.{,%d})\b' % (context_length, needle, context_length), haystack) 

# Returns a list of three-tuples, (context before, match, context after). 

Utilisation:

>>> find_with_context(s, 'building a website', 25) 
[(' the need for this when ', 'building a website', " where i'd have to show ")] 
>>> # Compare this to what it would be without making sure it ends at word boundaries: 
... # [('d the need for this when ', 'building a website', " where i'd have to show l")] 
... 
>>> for match in find_with_context(s, 'building a website', 25): 
...  print '<p>...%s<strong>%s</strong>%s...</p>' % match 
... 
<p>... the need for this when <strong>building a website</strong> where i'd have to show ...</p> 
+0

Je suis confus, quelle est la longueur du contexte? Pouvez-vous donner un exemple en utilisant ceci? – imns

+0

@bababa: réponse mise à jour pour clarifier cela (et corriger un bug d'arrêt que j'avais) –

+0

C'est exactement ce que je cherchais. Je ne suis pas très versé dans les expressions régulières. Y a-t-il un moyen de couper la context_length à un espace afin que les mots ne soient pas coupés en deux? – imns

Questions connexes