특정 패턴 사이의 선을 인쇄, 내 문자열입니다내가 특정 문자열 사이의 라인을 인쇄 할
##start/file1/file/images/graphs/main
##start/info/version/version/info/main
어떻게하면됩니까? 나는 두 개의 # 시작 사이에 줄을 찾고 main을 찾으려고 노력했다.
특정 패턴 사이의 선을 인쇄, 내 문자열입니다내가 특정 문자열 사이의 라인을 인쇄 할
##start/file1/file/images/graphs/main
##start/info/version/version/info/main
어떻게하면됩니까? 나는 두 개의 # 시작 사이에 줄을 찾고 main을 찾으려고 노력했다.
시도 뭔가 같은 :
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
파이썬의 정규 표현식 파서와 함께 할 수있는 방법 짧게 정규식라고 있습니다.
기본적으로 정규 표현식은 문자열을 통해 특정 패턴을 검색하는 데 사용되는이 전체 언어입니다. 문자열이 '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
을 일치합니다