2009-08-08 4 views
2

Je dois trouver toutes les initialisations (mots de la lettre majuscule, tels que SAP, JSON ou XML) dans mes fichiers texte. Y a-t-il un script prêt à l'emploi pour cela? Ruby, Python, Perl - la langue n'a pas d'importance. Jusqu'à présent, je n'ai rien trouvé.Comment trouver toutes les initialisations dans un texte?

Cordialement,

Stefan

+1

Est-il acceptable de faire correspondre un mot majuscule ou avez-vous une liste distincte d'acronymes? –

+0

Une liste serait bien. Des solutions appropriées sont fournies ci-dessous. Super :-) – Stefan

+0

@Stefan: Vous avez tagué ce 'rechercher-et-remplacer'. Essaies-tu réellement de remplacer ces mots par quelque chose? –

Répondre

20

Ici, vous allez:

perl -e 'for (<>) { for (m/\b([[:upper:]]{2,})\b/) { print "$1\n"; } }' textinput.txt 

Grabs tous les mots en majuscules qui sont au moins deux caractères. J'utilise [[:upper:]] au lieu de [A-Z] pour que cela fonctionne dans tous les paramètres régionaux.

+0

Merci, fonctionne comme un charme. – Stefan

+3

+1 pour prendre en compte les paramètres régionaux – Hobo

2

Une expression régulière comme /[A-Z]{2,}/ devrait faire l'affaire.

+1

Cela correspond également à des chaînes comme fooBARbaz. Et il ne supporte pas les jeux de caractères internationaux. –

+0

Correct mais l'OP dit "texte brut", donc je pense que ce serait assez bon. Si le texte contient des mots de ce genre, vous devez placer le motif dans les balises \ b et si un jeu de caractères international est utilisé, des caractères supplémentaires doivent être ajoutés. –

4

Une version plus simple de Conspicuous Compiler's answer utilise le drapeau -p pour découper tout ce que le code de boucle laid:

perl -p -e 'm/\b([[:upper:]]{2,})\b/' input.txt 
+0

Deux problèmes avec ceci: (1) Il imprime la ligne entière lorsqu'elle correspond. (2) Il ne correspond qu'une fois par ligne, de sorte qu'il n'obtiendra pas plusieurs abréviations sur une ligne. Vous aurez besoin d'au moins une boucle. –

+0

Voici une variante qui imprime seulement l'abréviation, mais obtient seulement la dernière abréviation par ligne: perl -p -e 's /.* \ b ([[: supérieur:]] {2,}) \ b. */\ 1/'textinput.txt –

+0

@Compilente Compilateur: Bons points. J'ai demandé au PO un éclaircissement. Je vais supprimer cette réponse si ce n'est pas suffisant. –

0

est ici une solution 2.x Python qui permet de chiffres (voir l'exemple). Mise à jour: Le code fonctionne maintenant pour Python 3.1, 3.0 et 2.1 à 2.6 inclusivement.

dos-prompt>type find_acronyms.py 
import re 

try: 
    set 
except NameError: 
    try: 
     from sets import Set as set # Python 2.3 
    except ImportError: 
     class set: # Python 2.2 and earlier 
      # VERY minimal implementation 
      def __init__(self): 
       self.d = {} 
      def add(self, element): 
       self.d[element] = None 
      def __str__(self): 
       return 'set(%s)' % self.d.keys() 

word_regex = re.compile(r"\w{2,}", re.LOCALE) 
# min length is 2 characters 

def accumulate_acronyms(a_set, an_iterable): 
    # updates a_set in situ 
    for line in an_iterable: 
     for word in word_regex.findall(line): 
      if word.isupper() and "_" not in word: 
       a_set.add(word) 

test_data = """ 
A BB CCC _DD EE_ a bb ccc k9 K9 A1 
It's a CHARLIE FOXTROT, said MAJ Major Major USAAF RETD. 
FBI CIA MI5 MI6 SDECE OGPU NKVD KGB FSB 
BB CCC# duplicates 
_ABC_DEF_GHI_ 123 666 # no acronyms here 
""" 

result = set() 
accumulate_acronyms(result, test_data.splitlines()) 
print(result) 


dos-prompt>\python26\python find_acronyms.py 
set(['CIA', 'OGPU', 'BB', 'RETD', 'CHARLIE', 'FSB', 
'NKVD', 'A1', 'SDECE', 'KGB', 'MI6', 'USAAF', 'K9', 'MAJ', 
'MI5', 'FBI', 'CCC', 'FOXTROT']) 
# Above output has had newlines inserted for ease of reading. 
# Output from 3.0 & 3.1 differs slightly in presentation. 
# Output from 2.1 differs in item order. 
+1

Sémantiquement, il y a la classe générale des «mots raccourcis», les abréviations qui incluent les initiales (formées des lettres initiales d'une série de mots) et les acronymes (une abréviation prononçable qui peut être ou ne pas être un initialisme). Les initialisations sont presque toujours en majuscules. D'autres types d'abréviations peuvent être ou ne pas être. –

+0

'\ b' vaut la peine d'utiliser –

+0

@Alexandr: S'il vous plaît fournir un exemple concret de où/comment ''\ b'' vaudrait la peine d'utiliser. –

Questions connexes