2010-12-22 3 views
3

나는 "SAB_bARGS_D"과 같은 문자열을 가지고 있습니다. 내가 원하는 것은 문자열이 문자 목록으로 나뉘어 지지만 _ 기호가있을 때마다 다음 문자가 이전 문자에 추가됩니다.주어진 형식에 따라 문자열을 목록으로 나눕니다

그래서 위의 대답은 그것은 목록을 통과 루프를 사용하여 수행 할 수 있습니다하지만 사용할 수있는 붙박이 기능이 ['S','A','B_b','A','R','G','S_D']

.....

감사를해야한다 많은


업데이트

안녕 모두

,

덕분에 Robert Rossney, aaronasterling 나는 필요한 답을 얻었지만 나는 여기에 대해서만 묻고 싶다. 정확히 비슷한 질문을한다. ...... 이제는 내 문자열에 편지 나 편지를 가질 수있는 critaria가있다. 그 다음에 _과 숫자 ..... 문자열을리스트에 어떻게 분리 할 수 ​​있습니까? 제안 된 솔루션은 S_10이 S_1과 0으로 분리 될 것이므로 지금 사용할 수 없습니다. 누군가가 RE를 사용하여 그렇게하는 법을 말할 수 있다면 도움이된다 .... 고마워 ....

+1

사용. 목록 이해력 솔루션은 근본적으로 최소한 두 번 통과해야하며 가독성을 위해 끔찍할 것입니다. – aaronasterling

+1

누구나 for 루프를 사용하여이를 보여줄 수 있습니까? – user225312

+0

"SAB_b_ARGS_D"이 (가)이 입력을 할 수 있습니까? – Rozuur

답변

5

은 내가 정규 표현식을 사용합니다, 알고 밑줄이 아닌 문자.

+0

안녕하세요 당신의 대답은 제가 원했던 것이 었습니다 ....하지만 물어볼 질문이 있습니다 .... for for loop suggestion 복잡성의 관점에서 아래에 주어진 ??? 마찬가지로 나는 패턴을 검사하는 데 다시 사용되는 것을 인식하지 못하기 때문에 일반 루프를 사용하는 것과 비교하여 성능이 저하됩니다 .....이 검색에서 특별히 의심하지 않는 일반적인 오류 ..... –

+0

'timeit'을 사용하면,이 경우're.findall'을 사용하는 것이 아래의 함수를 사용하는 것보다 약간 빠르다는 것을 알게 될 것입니다 - 그래서 둘은 복잡하다는 점을 짐작하게합니다. 처리 복잡성. 코드 복잡성은 또 다른 문제입니다. –

+0

또한 후속 질문에'[a-z] _ [0-9] + | [a-z] '패턴을 사용하십시오. –

2

나는 아마도 for 루프를 사용할 것이다.

def a_split(inp_string): 
    res = [] 
    if not inp_string: return res # allows us to assume the string is nonempty 

    # This avoids taking res[-1] when res is empty if the string starts with _ 
    # and simplifies the loop. 
    inp = iter(inp_string) 
    last = next(inp) 
    res.append(last) 

    for c in inp: 
     if '_' in (c, last): # might want to use (c == '_' or last == '_') 
      res[-1] += c 
     else: 
      res.append(c) 
     last = c 
    return res 

당신은 어떤 성능을 내 로컬 변수에 res.append을 저장하고 append 방법을 얻을 수 속성 조회를 수행 한 후 그것을 참조하는 대신 직접 지역 변수, res를 참조하고 얻을 얻을 수있을 것입니다.

'a_b_c'과 같은 문자열이 있으면 분할되지 않습니다. 이 경우 아무런 동작도 지정되지 않았지만 다른 작업을 수행하도록 수정하는 것은 어렵지 않습니다. 또한 '_ab'과 같은 문자열은 ['_a', 'b']으로, 'ab_'과 마찬가지로 분할됩니다. 비 밑줄, 강조, 비 밑줄 - - 그 실패하고, 일치 시키려고

>>> import re 
>>> pattern = "[^_]_[^_]|[^_]" 
>>> re.findall(pattern, "SAB_bARGS_D", re.IGNORECASE) 
['S', 'A', 'B_b', 'A', 'R', 'G', 'S_D'] 
패턴이 연속으로 3 개 문자를 일치 시키려고

가 :

1

나는`for` 루프가 여기에 최적이 될 것이라고 생각 정규 표현식을

>>> import re 
>>> s="SAB_bARGS_D" 
>>> re.findall("(.(?:_.)?)",s) 
['S', 'A', 'B_b', 'A', 'R', 'G', 'S_D'] 
관련 문제