2016-02-24 96 views
0

A有以下格式的一系列字符串。示範的例子是這樣的:如何在Python中第一次出現字母時分割字符串?

71 1 * abwhf

8 askg

*14 snbsb

00ab

我試圖寫將使用迴路循環一個Python 3程序通過每個字符串並在第一次出現字母時將它分割成一個與tw的列表o元素。

爲字符串輸出上述將成爲具有以下元素列表:

71 1 *abwhf

8askg

*14snbsb

00ab

還有就是應該是前三個例子中第一個字符串後面輸入一個空格,但是這隻能說明在編輯器中

我怎麼可以拆分這樣的字符串?

兩個職位尋找相關的位置:

關於第一個問題的第一個答案讓我在一個字符中首次出現分裂字符串但不是多個字符(如字母表中的所有字母)。

第二個允許我分開第一個字母,但不是一次。使用這將導致包含許多元素的數組。

回答

1

使用re.search

import re 

strs = ["71 1 * abwhf", "8 askg", "*14 snbsb", "00ab"] 


def split_on_letter(s): 
    match = re.compile("[^\W\d]").search(s) 
    return [s[:match.start()], s[match.start():]] 


for s in strs: 
    print split_on_letter(s) 

正則表達式匹配[^\W\d]所有字母字符。

\W匹配所有非字母數字字符,\d匹配所有數字字符。 ^在該集合的開始處反轉選擇以匹配不是(非字母數字或數字)的所有字母對應的所有內容。

match搜索字符串以找到匹配表達式第一次出現的索引。您可以根據匹配的位置切割原始字符串以獲取兩個列表。

+0

感謝您的回答。你能解釋一下函數中的代碼是如何工作的嗎? – LJD200

+0

這工作得很好。對於Python 3,括號需要在'print'函數週圍添加。 – LJD200

+0

@ LJD200說明已添加 –

2

我能想到的唯一的辦法是自己寫的函數:

import string 

def split_letters(old_string): 
    index = -1 
    for i, char in enumerate(old_string): 
     if char in string.letters: 
      index = i 
      break 
    else: 
     raise ValueError("No letters found") # or return old_string 
    return [old_string[:index], old_string[index:]] 
+0

感謝您的回答。這非常整齊。當運行它時,我收到一個異常:'AttributeError:模塊'字符串'沒有'字母'的屬性 – LJD200

+0

對不起,我通常使用Python2進行編碼。在Python3中,它被重命名爲'ascii_letters'。如果你想要一個可以在任何一個工作的東西,使用'string.lowercase + string.uppercase'。 – zondo

+0

沒問題。這工作得很好。謝謝! – LJD200

1

使用re.split()

import re 

strings = [ 
    "71 1 * abwhf", 
    "8 askg", 
    "*14 snbsb", 
    "00ab", 
] 

for string in strings: 
    a, b, c = re.split(r"([a-z])", string, 1, flags=re.I) 
    print(repr(a), repr(b + c)) 

產地:

'71 1 * ' 'abwhf' 
'8 ' 'askg' 
'*14 ' 'snbsb' 
'00' 'ab' 

這裏的技巧是我們分裂的任何字母,但僅要求一個單一的分裂。通過將模式置於括號中,我們保存了通常會丟失的分割字符。然後我們將分割字符添加回第二個字符串的前面。

+0

謝謝。這工作得很好。 – LJD200

0
sample1 = '71 1 * abwhf' 
sample2 = '8 askg' 
sample3 = '*14 snbsb' 
sample4 = '00ab' 
sample5 = '1234' 

def split_at_first_letter(txt): 
    for value in txt: 
     if value.isalpha(): 
      result = txt.split(value, 1) 
      return [result[0], '{}{}'.format(value, result[1],)] 

    return [txt] 

print(split_at_first_letter(sample1)) 
print(split_at_first_letter(sample2)) 
print(split_at_first_letter(sample3)) 
print(split_at_first_letter(sample4)) 
print(split_at_first_letter(sample5)) 

結果

['71 1 * ', 'abwhf'] 
['8 ', 'askg'] 
['*14 ', 'snbsb'] 
['00', 'ab'] 
['1234'] 
+0

感謝您的回答。 'return'語句中的代碼如何工作? – LJD200

+0

上一行中的拆分將刪除第二個列表項的第一個字符,即 以替換該字符,將從拆分的第一個元素(索引0) 創建一個新列表,並將已拆分的字符加上第二個元素的分割(索引1)一起格式化。 – Yoriz

+0

非常感謝。 – LJD200

相關問題