2017-04-18 107 views
0

在Python中有什麼辦法可以做到以下幾點?我有一個像"Trip HopDowntempoSynth-pop"這樣的字符串,我可以在大寫字符上分割,但是我想要的是以大寫字母分割,除非在空格之前。正則表達式以大寫字母拆分,但如果以空格開頭,則不會。

我嘗試添加一個!到:在我放置在除了

print (re.findall(r'[A-Z](?:A-Z*(?![a-z])|[a-z]*)',line)) 

與沒有區別。

+2

你可以添加你想要的輸出? –

+0

Findall和split是不同的東西。它也似乎你想分裂的空格後面是大寫,而不是大寫。你能舉一個例子輸入和輸出嗎?你可能需要一個像:'tweets_file = open('tweets.txt',「r」))'''''''aaa','BcccDeee qqqq 9.','Fggg','HiiiJeee']' – tdelaney

+0

例如,以大寫字母開頭而不是前面的空格是're.split(「(?<!)[AZ]」,「Trip HopDowntempoSynth-pop」)'這會導致'['','rip Hop','owntempo' ,'yyp-pop']'。我們需要幾個示例輸入和輸出,以便我們能夠找出各種條件。 – tdelaney

回答

1

你的意思是這樣的嗎?

re.split('\s+(?=[A-Z])', "Trip HopDowntempoSynth-pop") 
# ['Trip', 'HopDowntempoSynth-pop'] 

或者相反:

pattern = re.compile('[A-Z][^A-Z\s]+(?:\s+\S[^A-Z\s]*)*') 

pattern.findall("Trip HopDowntempoSynth-pop") 
# ['Trip Hop', 'Downtempo', 'Synth-pop'] 

pattern.findall("Trip Hop HHopDowntempoSynth-pop") 
#['Trip Hop H', 'Hop', 'Downtempo', 'Synth-pop'] 
+0

我相信他們想要的是相反的;你的例子只是分割那些空格前面的大寫字符。 OP想要分割所有大寫字符前面沒有空格 – Hamms

+0

@Hamms是的,我也加了相反的意思。 –

0

潛在迂迴,但取得的成績,我認爲你是通過迭代re.findall並使用應用re.sub替換的組合尋找與這使輸出端的佔位符是再拆......

import re 
s = "Trip HopDowntempoSynth-pop" 

pattern = re.compile("[a-z][A-Z]") 

matches = re.findall(pattern, s) 

for match in matches: 
    match_replacer = match[0] + '|' + match[1] 
    s = s.replace(match, match_replacer) 


s.split('|') 

匹配

['Trip Hop', 'Downtempo', 'Synth-pop'] 
+0

實際上,這假定大寫字母必須以小寫字母開頭,或者可以使用'pattern = re.compile(「[^ \ s] [A-Z]」) – caw5cv

0

這不是一個正則表達式,但它很容易適合您的問題。

s = "Trip HopDowntempoSynth-pop" 

arr = [] 
word = s[0] 
for i in range(1, len(s)): 
    if s[i].isupper(): 
     if s[i - 1] == " ": 
      word += s[i] 
     else: 
      arr.append(word) 
      word = s[i] 
    else: 
     word += s[i] 
arr.append(word) 

print(arr) 

它打印出一個數組,看起來像這樣:

[ '神遊舞曲', '緩拍', '合成器流行']

相關問題