2009-08-08 78 views
2

我必須在我的純文本文件中找到所有初始化(captial letter words,如SAP,JSON或XML)。有沒有現成的腳本? Ruby,Python,Perl - 語言無關緊要。到目前爲止,我一無所獲。如何在文本中查找所有初始化?

問候,

斯特凡

+1

可以匹配任何大寫字母的單詞嗎?還是您有單獨的首字母縮略詞列表? – 2009-08-08 10:48:20

+0

一個清單將是不錯的。下面提供了適當的解決方案。超級:-) – Stefan 2009-08-08 10:54:39

+0

@Stefan:你已經標記了這個'搜索和替換'。你是否真的試圖用一些東西來替換這些詞? – 2009-08-08 11:22:59

回答

20

在這裏你去:

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

抓鬥都至少有兩個字符長全部大寫的單詞。我使用[[:upper:]]而不是[A-Z],以便它可以在任何語言環境中使用。

+0

謝謝,像魅力一樣工作。 – Stefan 2009-08-08 10:57:00

+3

用於考慮區域設置的+1 – Hobo 2009-08-08 11:11:06

2

/[A-Z]{2,}/正則表達式應該做的伎倆。

+1

也匹配fooBARbaz等字符串。它不支持國際字符集。 – 2009-08-08 11:34:00

+0

正確,但OP說「純文本」,所以我認爲這將足夠好。如果文本包含這樣的文字,則需要將模式放在\ b標籤中,並且如果使用國際字符集,則必須添加額外的字符。 – 2009-08-08 21:17:51

4

Conspicuous Compiler's answer一個更簡單的版本使用-p標誌切出一切醜陋的循環代碼:

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

有兩個問題:(1)匹配時打印整行。 (2)每行僅匹配一次,所以不會在一行上得到多個縮寫。你至少需要一個循環。 – 2009-08-08 11:08:03

+0

下面是一個僅打印縮寫的變體,但僅獲取每行的最後一個縮寫: perl -p -e's /.* \ b([[:upper:]] {2,})\ b。*/\ 1 /'textinput.txt – 2009-08-08 11:25:55

+0

@醒目編譯器:好點。我已經要求OP進行一些分類。如果這個答案不夠,我會刪除這個答案。 – 2009-08-08 11:26:34

0

下面是一個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. 
+1

語義上,有一類「縮寫詞」,縮寫包括初始字母(由一系列字母的首字母組成)和首字母縮略詞(可以是或不是初始字母的可發音縮寫)。初始主義幾乎總是全部大寫。其他類型的縮寫可能會或可能不會。對於我所知道的「全部大寫詞」,沒有一個簡潔的詞... – 2009-08-08 17:59:33

+0

'\ b'值得使用 – 2009-08-08 21:46:18

+0

@Alexandr:請提供一個具體的例子,說明\'\ b''值得使用的地方/方式。 – 2009-08-08 22:32:32