2011-12-19 3 views
1

문자열이 #abcde#jfdkjfd 인 경우 두 문자열을 어떻게 얻을 수 있습니까 #? 또한 # 쌍이 없으면 (# 또는 하나만 #을 의미 함)이 함수는 None을 반환합니다.파이썬 문자열 정규 표현식을 사용하여 구문 분석

+0

기본 정규 표현식으로이를 수행 할 수 있습니다. http://www.regular-expressions.info/를보십시오. –

답변

7
>>> import re 
>>> s = "abc#def#ghi#jkl" 
>>> re.findall(r"(?<=#)[^#]+(?=#)", s) 
['def', 'ghi'] 

설명 :

(?<=#) # Assert that the previous character is a # 
[^#]+ # Match 1 or more non-# characters 
(?=#) # Assert that the next character is a # 
2

사용 (?<=#)(\w+)(?=#)하고 첫 번째 그룹을 캡처합니다. 여러 내장 문자열을 포함하는 문자열을 순환 시켜도 작동 할 수 있습니다.

긍정적 인 검색 표시와 긍정적 인 미리보기를 모두 사용합니다.

+0

검색의 일부가 아니기 때문에 그룹이 필요하지 않습니다. –

+0

예, 그건 사실입니다 ... 그냥 습관! – fge

1

정규 표현식을 주장하고 어떤 결과가 다음 쉬운 방법이없는 경우 경우 대신 None의 빈 목록을 받아 기꺼이하지 않는 경우는 다음과 같습니다

>>> "#abcde#jfdkjfd".split('#')[1:-1] 
['abcde'] 

주 그 결과 정말 하나 이상의 결과를 가질 수있는 목록이어야합니다.

당신은 (이것은 또한 없음에 빈 문자열을 설정하는 것처럼 완벽하지하지만) 빈리스트 대신 None을 받고 주장하는 경우 : 당신은 단지 당신이 할 수있는 최초의 표시 문자열을 원하는 경우

>>> "#abcde#jfdkjfd".split('#')[1:-1] or None 
['abcde'] 

을 이 :

>>> def first_marked(s): 
    token = s.split('#') 
    if len(token) >= 3: 
     return token[1] 
    else: 
     return None 


>>> first_marked("#abcde#jfdkjfd") 
'abcde' 
관련 문제