2013-03-13 3 views

답변

0

시도 뭔가 같은 :

def get_mains(my_string): 
    section = '' 

    for line in my_string.split('\n'): 
     if line[0:7] == "##start": 
      section = line 
      continue 
     if 'main' in line: 
      yield '/'.join([section, line]) 

for main in get_mains(my_string): 
    print main 
0

파이썬의 정규 표현식 파서와 함께 할 수있는 방법 짧게 정규식라고 있습니다.

기본적으로 정규 표현식은 문자열을 통해 특정 패턴을 검색하는 데 사용되는이 전체 언어입니다. 문자열이 'Hello, World' 인 경우 정규 표현식 패턴 'llo, Wor'과 일치합니다. ell 다음에 ell이오고 그 뒤에 o가오고 쉼표와 공백, 대문자가 두 개인 등이 포함되어 있기 때문입니다. 표면에서는 부분 문자열 테스트처럼 보입니다. 정규 표현식의 진정한 힘은 특수 문자와 함께 제공됩니다. 문자 'Hello, World'이 다시있는 경우 \w은 알파벳의 문자를 나타내는 특수 문자이기 때문에 'Hello, \w\w\w\w\w' 패턴과도 일치합니다 (일부 추가 기능 포함). 그래서 'Hello, Bobby', 'Hello, World', 'Hello, kitty'\w이 어떤 문자로도 쓸 수 있기 때문에 모두 'Hello, \w\w\w\w\w' 패턴과 일치합니다. 이 '특수 문자'가 더 많이 있으며 모두 매우 유용합니다. 실제로 귀하의 질문에 대답하기 위해,

나는 선행 연구는 문자열을 원시 문자열 (그래서 우리는 두 배로 필요가 없습니다하게

r'(##start{line}){line}*?(.*main)'.format(line=r'(?:.*\n)') 

입니다

##start\textICareAbout 
file_I_don't_care 
file_I_don't_care 
file_I_care_about\main 

일치하는 패턴을 구축 백 슬래시 개행, 링크 된 웹 페이지 참조). 그런 다음 괄호 안에있는 모든 것이 그룹이됩니다. 그룹은 우리가 나중에 기억할 수있는 텍스트의 모음입니다. 두 그룹이 있습니다. 첫 번째는 (##start{line})이고 두 번째 것은 (.*main)입니다. 첫 번째 그룹은 ##start으로 시작하고 전체 라인에서 계속됩니다. 따라서 ##start/file1 또는 ##start/new 과 같은 라인이 있습니다. 두 번째 그룹은 줄 바꿈을 제외한 모든 문자와 .*이 일치하므로 두 번째 그룹은 main에서 끝나는 라인과 일치합니다. 두 그룹 사이에는 {line}*이 있는데, 이는 '완전한 라인이고 일치하는 모든 것을 일치시킵니다'라는 의미입니다. 이렇게 모든 것을 묶는다면 : 은 ##start으로 시작하는 모든 것을 매치하고, 몇 줄의 매치를 매치 시켜서 main으로 끝나는 줄을 매치합니다. 귀하의 예를 들어

import re 

# define my_string here 

pattern = re.compile(r'(##start{line}){line}*?(.*main)'.format(line=r'(?:.*\n)')) 

for match in pattern.findall(my_string): 
    string = match[0][:-1] # don't want the trailing \n 
    string += '/' 
    string += match[1] 
    print string 

, 그것은

##start/file1/file/images/graphs/main 
##start/new/version/info/main 

그래서 정규식은 정말 멋진이며, 다른 언어도 그것을 가지고 출력합니다. 그것은 매우 강력한 도구이며 사용 방법을 배워야합니다 here. 사이드 노트로도 사용합니다.내가 훨씬 깨끗하고 쉽게 읽을 수 생겼다고 생각하기 때문에 때문에 포맷 기능, 'hello{line}world'.format(line=r'(?:.*\n)')'hello(?:.*\n)world'로 평가된다, 그것은

hello 
Any Text Here. Anything at all. (just for one line) 
world 
을 일치합니다
관련 문제