簡體   English   中英

使用正則表達式查找大寫單詞

[英]Find Uppercase Words with Regex

我有一個看起來像這樣的字符串:

df = '''
ACCP ACLL ADER ADERW AEAC AEACW AHI AIRTP AKO/A AKO/B ALIT AMHCU ANDAU APOPW AUGZ AUUD AUUDW 
AVDG AVDR AYTUP BBRX BCAC BCACU BCACW BCTX BCTXW BF/A BF/B BIO/B BRK/A BRK/B BRLIU BRPAU BWL/A 
CCZ CFCV CMCTP CMPX CNNB CNTX COMSW CPTAG CPTI CRD/A CRD/B CRTDW DDI DECZ DEFN DFH DRMT DSOC EAC 
EACPW: No data found, symbol may be delisted- ECC : No data found, symbol may be delisted- ECOM :
No data found, symbol may be delisted
'''

我需要用正則表達式從這個字符串中提取所有符號,結果是這樣的:

result = 'ACCP ACLL ADER ADERW AEAC AEACW AHI AIRTP AKO/A AKO/B ALIT AMHCU ANDAU APOPW AUGZ AUUD AUUDW 
AVDG AVDR AYTUP BBRX BCAC BCACU BCACW BCTX BCTXW BF/A BF/B BIO/B BRK/A BRK/B BRLIU BRPAU BWL/A 
CCZ CFCV CMCTP CMPX CNNB CNTX COMSW CPTAG CPTI CRD/A CRD/B CRTDW DDI DECZ DEFN DFH DRMT DSOC EAC 
EACPW ECC ECOM'

我已經嘗試通過以下方式獲取所有以兩個大寫字母開頭的單詞:

"\b[A-Z]{2}\b"

還有這個:

"\b[A-Z]+[A-Z\/]+\b"

最后一個工作正常但僅適用於字符串的初始單詞,因此可能是不考慮單詞之間的空格的問題,無論如何,在這種情況下都不起作用:

在這種情況下需要什么正則表達式模式?

您所需要的只是一個簡單的列表理解。

例如:

df = '''
ACCP ACLL ADER ADERW AEAC AEACW AHI AIRTP AKO/A AKO/B ALIT AMHCU ANDAU APOPW AUGZ AUUD AUUDW 
AVDG AVDR AYTUP BBRX BCAC BCACU BCACW BCTX BCTXW BF/A BF/B BIO/B BRK/A BRK/B BRLIU BRPAU BWL/A 
CCZ CFCV CMCTP CMPX CNNB CNTX COMSW CPTAG CPTI CRD/A CRD/B CRTDW DDI DECZ DEFN DFH DRMT DSOC EAC 
EACPW: No data found, symbol may be delisted- ECC : No data found, symbol may be delisted- ECOM :
No data found, symbol may be delisted
'''

print([w for w in df.split() if w.isupper() and len(w) > 2])

Output:

['ACCP', 'ACLL', 'ADER', 'ADERW', 'AEAC', 'AEACW', 'AHI', 'AIRTP', 'AKO/A', 'AKO/B', 'ALIT', 'AMHCU', 'ANDAU', 'APOPW', 'AUGZ', 'AUUD', 'AUUDW', 'AVDG', 'AVDR', 'AYTUP', 'BBRX', 'BCAC', 'BCACU', 'BCACW', 'BCTX', 'BCTXW', 'BF/A', 'BF/B', 'BIO/B', 'BRK/A', 'BRK/B', 'BRLIU', 'BRPAU', 'BWL/A', 'CCZ', 'CFCV', 'CMCTP', 'CMPX', 'CNNB', 'CNTX', 'COMSW', 'CPTAG', 'CPTI', 'CRD/A', 'CRD/B', 'CRTDW', 'DDI', 'DECZ', 'DEFN', 'DFH', 'DRMT', 'DSOC', 'EAC', 'EACPW:', 'ECC', 'ECOM']

無可否認,您可能想要改進這一點,例如通過使用set ,但它似乎獲得了所有的股票代碼:

import string 

ticker = [
    word for word in df.split() if \
    all(char in string.ascii_uppercase + '/' for char in word)
]

另一種選擇是將第二個模式\b[AZ]+[AZ\/]+\bre.findall一起使用,然后將各部分連接在一起。

import re

df = '''
ACCP ACLL ADER ADERW AEAC AEACW AHI AIRTP AKO/A AKO/B ALIT AMHCU ANDAU APOPW AUGZ AUUD AUUDW 
AVDG AVDR AYTUP BBRX BCAC BCACU BCACW BCTX BCTXW BF/A BF/B BIO/B BRK/A BRK/B BRLIU BRPAU BWL/A 
CCZ CFCV CMCTP CMPX CNNB CNTX COMSW CPTAG CPTI CRD/A CRD/B CRTDW DDI DECZ DEFN DFH DRMT DSOC EAC 
EACPW: No data found, symbol may be delisted- ECC : No data found, symbol may be delisted- ECOM :
No data found, symbol may be delisted
'''

result = ' '.join(re.findall(r"\b[A-Z]+[A-Z\/]+\b", df))
print(result)

Output

ACCP ACLL ADER ADERW AEAC AEACW AHI AIRTP AKO/A AKO/B ALIT AMHCU ANDAU APOPW AUGZ AUUD AUUDW AVDG AVDR AYTUP BBRX BCAC BCACU BCACW BCTX BCTXW BF/A BF/B BIO/B BRK/A BRK/B BRLIU BRPAU BWL/A CCZ CFCV CMCTP CMPX CNNB CNTX COMSW CPTAG CPTI CRD/A CRD/B CRTDW DDI DECZ DEFN DFH DRMT DSOC EAC EACPW ECC ECOM

Python演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM