簡體   English   中英

如何從字符串中提取所有 UPPER? Python

[英]How to extract all UPPER from a string? Python

#input
my_string = 'abcdefgABCDEFGHIJKLMNOP'

如何從字符串中提取所有 UPPER?

#output
my_upper = 'ABCDEFGHIJKLMNOP'

使用列表理解:

>>> s = 'abcdefgABCDEFGHIJKLMNOP'
>>> ''.join([c for c in s if c.isupper()])
'ABCDEFGHIJKLMNOP'

使用生成器表達式:

>>> ''.join(c for c in s if c.isupper())
'ABCDEFGHIJKLMNOP

您也可以使用正則表達式來做到這一點:

>>> re.sub('[^A-Z]', '', s)
'ABCDEFGHIJKLMNOP'
import string
s = 'abcdefgABCDEFGHIJKLMNOP'
s.translate(None,string.ascii_lowercase)

string.translate(S,表[,deletechars])函數將從處於deletechars字符串,字符的列表中刪除所有字符。 然后,字符串將使用 table 進行翻譯(在這種情況下我們不使用它)

要僅刪除小寫字母,您需要傳遞string.ascii_lowercase作為要刪除的字母列表。

table為 None ,因為當該表為None ,只會執行字符刪除步驟。

高階函數來救援!

filter(str.isupper, "abcdefgABCDEFGHIJKLMNOP")

編輯:如果您不知道過濾器的作用:過濾器接受一個函數和一個可迭代對象,然后將該函數應用於可迭代對象中的每個元素。 它保留所有返回 true 的值並丟棄所有其余的值。 因此,這將返回“ABCDEFGHIJKLMNOP”。

或使用正則表達式...這是一個簡單的答案

import re
print ''.join(re.findall('[A-Z]+',my_string))

僅供比較

In [6]: %timeit filter(str.isupper,my_list)
1000 loops, best of 3: 774 us per loop

In [7]: %timeit ''.join(re.findall('[A-Z]+',my_list))
1000 loops, best of 3: 563 us per loop

In [8]: %timeit re.sub('[^A-Z]', '', my_list)
1000 loops, best of 3: 869 us per loop

In [10]: %timeit ''.join(c for c in my_list if c.isupper())
1000 loops, best of 3: 1.05 ms per loop

所以這個 join 加上 findall 是最快的方法(每個 ipython %timeit (python 2.6)),使用 10000 個字符長的相同字符串

編輯:或不

In [12]: %timeit  my_list.translate(None,string.ascii_lowercase)
10000 loops, best of 3: 51.6 us per loop

您可以使用更實用的方法

>>> s = 'abcdefgABCDEFGHIJKLMNOP'
>>> filter(str.isupper, s)
'ABCDEFGHIJKLMNOP'

干得好:

my_string = 'abcdefgABCDEFGHIJKLMNOP'

cleanChar = ''

for char in my_string:
    if char in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
        cleanChar = cleanChar + char

newChar = cleanChar
print(" {}".format(newChar))
for char in my_string:
     if char in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
         print(char)

暫無
暫無

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

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