2017-04-18 106 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) 

它打印出一个数组,看起来像这样:

[ '神游舞曲', '缓拍', '合成器流行']

相关问题