2013-04-04 4 views
1

내가 모두 대문자와 잠재적 소문자 여기 regex를 사용하여 문자열의 소문자를 모두 찾아 목록에 추가합니다. 파이썬

이 문자열에서 소문자 값을 얻을 수있는 방법을 찾고 있어요 것은이 내가 출력

에 원하는 것입니다

sequences = ['CABCABCABdefgdefgdefgCABCAB','FEGFEGFEGwowhelloFEGFEGonemoreFEG','NONEARELOWERCASE'] #sequences with uppercase and potentially lowercase letters 

예입니다

upper_output = ['CABCABCABCABCAB','FEGFEGFEGFEGFEGFEG','NONEARELOWERCASE'] #the upper case letters joined together 
lower_output = [['defgdefgdefg'],['wowhello','onemore'],[]] #the lower case letters in lists within lists 
lower_indx = [[9],[9,23],[]] #where the lower case values occur in the original sequence 

그래서 lower_output 목록을 SUBLISTS의 목록으로 만들고 싶습니다. SUBLISTS는 모든 소문자 문자열을 갖습니다.

정규식을 사용하려고 생각했습니다. . . 소문자 목록 내가하려고했던 대한

import re 

lower_indx = [] 

for seq in sequences: 
    lower_indx.append(re.findall("[a-z]", seq).start()) 

print lower_indx 

:

lower_output = [] 

for seq in sequences: 
    temp = '' 
    temp = re.findall("[a-z]", seq) 
    lower_output.append(temp) 

print lower_output 

을하지만 값이 별도의 목록에없는 정규식에서 별도로

[['d', 'e', 'f', 'g', 'd', 'e', 'f', 'g', 'd', 'e', 'f', 'g'], ['w', 'o', 'w', 'h', 'e', 'l', 'l', 'o', 'o', 'n', 'e', 'm', 'o', 'r', 'e'], []] 
+0

... 그래서 질문은 무엇입니까 ? 정규 표현식을 사용하여 모든 것을 한 번에 캡처하는 방법을 알아야합니까? 아니면 문자에 참여해야합니까? –

+5

'[a-z] +'시도해보기 – JDB

+0

목록이 아닌 목록을 알파가 아닌 부분으로 나눠서 왜 폭발시키지 않겠습니까? –

답변

2

여러분의 질문을 오해 할 수도 있습니다. 단지 을 캡처하면 각 소문자가 아닌이 소문자로 실행됩니다. 이것은 쉽습니다 : + 한정 기호를 정규 표현식에 추가하기 만하면됩니다.

for seq in sequences: 
    lower_output.append(re.findall("[a-z]+", seq)) # add substrings 

+ 정량 당신이 원하는 "적어도 하나, 당신은 행에서 찾을 수있는만큼"(이 경우 '[a-z]'에) 위의 식을 지정합니다. 따라서 소문자를 모두 하나의 그룹으로 가져와 결과 목록에 원하는 소문자를 표시해야합니다.

당신이 당신의리스트의 목록 구조를 유지뿐만 아니라 인덱스를 얻으려면 그것은 조금 큰 모양은 좋지를 얻을 수 있지만, 그것은 여전히 ​​매우 간단합니다 : 정확히,

for seq in sequences: 
    matches = re.finditer("[a-z]+", seq) # List of Match objects. 
    lower_output.append([match.group(0) for match in matches]) # add substrings 
    lower_indx.append([match.start(0) for match in matches]) # add indices 

print lower_output 
>>> [['defgdefgdefg'], ['wowhello', 'onemore'], []] 

print lower_indx 
>>> [[9], [9, 23], []] 
+0

그 존재를 알지 못했습니다. 인덱스 값을 얻는 방법에 대한 아이디어? –

+0

@ draconisthe0ry 틀림없이; 내가 그들을 포함하도록 내 대답을 업데이 트했습니다. –

0

당신이 할 수있는 (난 여전히 그들에 가입해야합니다) 여기 itertools.groupby을 사용하십시오.

In [39]: sequences = ['CABCABCABdefgdefgdefgCABCAB','FEGFEGFEGwowhelloFEGFEGonemoreFEG','NONEARELOWERCASE'] #sequences with uppercase and potentially lowercase letters 

In [40]: lis=[["".join(v) for k,v in groupby(x,key=lambda z:z.islower())] for x in sequences] 

In [41]: upper_output=["".join(x[::2]) for x in lis] 

In [42]: lower_output=[x[1::2] for x in lis] 

In [43]: upper_output 
Out[43]: ['CABCABCABCABCAB', 'FEGFEGFEGFEGFEGFEG', 'NONEARELOWERCASE'] 

In [44]: lower_output 
Out[44]: [['defgdefgdefg'], ['wowhello', 'onemore'], []] 

In [45]: lower_indx=[[sequences[i].index(y) for y in x] for i,x in enumerate(lower_output)] 

In [46]: lower_indx 
Out[46]: [[9], [9, 23], []]