Как я могу найти все инициализации в тексте? - PullRequest
2 голосов
/ 08 августа 2009

Я должен найти все инициализации (прописные буквенные слова, такие как SAP, JSON или XML) в моих текстовых файлах. Есть ли готовый скрипт для этого? Ruby, Python, Perl - язык не имеет значения. Пока ничего не нашел.

С уважением,

Stefan

Ответы [ 4 ]

20 голосов
/ 08 августа 2009

Вот, пожалуйста:

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

Захватывает все заглавные слова длиной не менее двух символов. Я использую [[:upper:]] вместо [A-Z], чтобы он работал в любой локали.

4 голосов
/ 08 августа 2009

Более простая версия Ответ Conspicuous Compiler использует флаг -p, чтобы вырезать весь этот уродливый код цикла:

perl -p -e 'm/\b([[:upper:]]{2,})\b/' input.txt
2 голосов
/ 08 августа 2009

Регулярное выражение типа /[A-Z]{2,}/ должно сработать.

0 голосов
/ 08 августа 2009

Вот решение Python 2.x, которое позволяет использовать цифры (см. Пример). Обновление: Код теперь работает для Python 3.1, 3.0 и 2.1 до 2.6 включительно.

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...