2014-07-17 10 views
1

문자열에서 일부 정보를 추출하기 위해 Python으로 정규 표현식을 작성하려고합니다.정규식을 사용하여 문자열에서 정보 추출

을 감안할 때 :

"Only in Api_git/Api/folder A: new.txt" 

I 인쇄 싶습니다

Folder Path: Api_git/Api/folder A 
Filename: new.txt 

re manual page에 대한 몇 가지 예를 살펴 가진 후, 나는 아직도 조금 붙어있어.

나는
m = re.match(r"(Only in ?P<folder_path>\w+:?P<filename>\w+)","Only in Api_git/Api/folder A: new.txt") 

print m.group('folder_path') 
print m.group('filename') 

이 사람이 올바른 방향으로 날 지점 수

지금까지 시도했습니다 무엇?

+0

':'(으)로 분할 할 수 있습니까? – Dalorzo

답변

4

캡처 그룹을 사용하여 인덱스 1과 2에서 일치하는 그룹을 가져옵니다.

^Only in ([^:]*): (.*)$ 

여기 demo

샘플 코드입니다 :


그런 다음 아래의 형식으로 인쇄 대체와 시도하려는 경우

import re 
p = re.compile(ur'^Only in ([^:]*): (.*)$') 
test_str = u"Only in Api_git/Api/folder A: new.txt" 

re.findall(p, test_str) 
.
Folder Path: Api_git/Api/folder A 
Filename: new.txt 

DEMO

샘플 코드 :

import re 
p = re.compile(ur'^Only in ([^:]*): (.*)$') 
test_str = u"Only in Api_git/Api/folder A: new.txt" 
subst = u"Folder Path: $1\nFilename: $2" 

result = re.sub(p, subst, test_str) 
+0

이봐,이게 좋아 보인다! 몇 가지 질문이 있지만, "Folder Path : $ 1"만 인쇄하기 때문에 오타가 있다고 생각합니다. 또한 각 값을 자체 변수에 저장하는 빠른 방법이 있습니다. 'folder_path = test_str ('folder_path') filename = test_str ('filename') – TomSelleck

+0

첫 번째 예제와 일치하는 그룹을 가져옵니다. 원하는 출력을 인쇄하기 위해 두 번째 예제를 언급했습니다. – Braj

+0

자세히 알아보기 [findall로 그룹 캡처하기] (http://stackoverflow.com/questions/6018340/capturing-group-with-findall) – Braj

1

귀하의 패턴 : (Only in ?P<folder_path>\w+:?P<filename>\w+) 그것에 몇 가지 결함을 가지고있다.

?P 구조는 괄호로 둘러싸인 식 안에있는 첫 번째 비트로만 유효하므로 이것을 필요로합니다.

(Only in (?P<folder_path>\w+):(?P<filename>\w+)) 

\w 문자 클래스는 문자와 밑줄로만 사용됩니다. 예를 들어, / 또는 .과 일치하지 않습니다. 요구 사항과보다 밀접하게 조화되는 다른 문자 클래스를 사용해야합니다. 사실, 우리는 단지 ., 거의 모든 캐릭터의 클래스를 사용할 수 있습니다

(Only in (?P<folder_path>.+):(?P<filename>.+)) 

콜론은 예를 들어 텍스트에서 후 공간이 마련되어 있습니다. 일치해야합니다 :

(Only in (?P<folder_path>.+): (?P<filename>.+)) 

가장 바깥 쪽 괄호는 필요하지 않습니다. 그들은 잘못이 아니며 단지 필요하지 않습니다.

Only in (?P<folder_path>.+): (?P<filename>.+) 

정규 표현식 엔진 호출과 별도로 정규 표현식을 제공하는 것이 편리한 경우가 많습니다.상기

regex = r'Only in (?P<folder_path>.+): (?P<filename>.+)' 
... # several lines later 
m = re.match(regex, "Only in Api_git/Api/folder A: new.txt") 

를 프로그래머를 순수하다 :이 용이하게 예를 들면, 새로운 변수를 생성함으로써 달성된다는 저장되지 않으며 시간이나 메모리 공간을 낭비하는 둘. 그러나 정규 표현식에 관련된 시간을 절약 할 수있는 기술이 있습니다 : 을 컴파일하십시오.

이 코드 세그먼트 고려 :

regex = r'Only in (?P<folder_path>.+): (?P<filename>.+)' 
for line in input_file: 
    m = re.match(regex, line) 
    ... 

루프의 각 반복를 들어, 정규 표현식 엔진은 정규 표현식을 해석하고 line 변수에 적용해야합니다. re 모듈을 사용하면 해석을 응용 프로그램과 분리 할 수 ​​있습니다. 우리는 여러 번 한 번 해석하지만, 적용 할 수 있습니다

regex = re.compile(r'Only in (?P<folder_path>.+): (?P<filename>.+)') 
for line in input_file: 
    m = re.match(regex, line) 
    ... 

지금, 당신의 원래 프로그램은 다음과 같이한다 :

regex = re.compile(r'Only in (?P<folder_path>.+): (?P<filename>.+)') 
m = re.match(regex, "Only in Api_git/Api/folder A: new.txt") 
print m.group('folder_path') 
print m.group('filename') 

그러나, 나는 정규 표현식을 설명하는 주석을 사용하는 팬입니다. 일반적인 정리를 포함하여 내 버전은 다음과 같습니다 : 정말 입력의 제한에 따라

import re 
regex = re.compile(r'''(?x)    # Verbose 
      Only\ in\    # Literal match 
      (?P<folder_path>.+) # match longest sequence of anything, and put in 'folder_path' 
      :\     # Literal match 
      (?P<filename>.+)  # match longest sequence of anything and put in 'filename' 
      ''') 

with open('diff.out') as input_file: 
    for line in input_file: 
     m = re.match(regex, line) 
     if m: 
      print m.group('folder_path') 
      print m.group('filename') 
+0

re.match()에서 정규식을 추출하는 방법이 있습니까? – TomSelleck

+0

"* 추출 *"은 무엇을 의미합니까? –

+0

죄송합니다 - re.match ("regex") 외부에서 정규식을 정의하려고했습니다. – TomSelleck

0

을이이 트릭을 할 수있는 유일한 입력합니다.

^Only in (?P<folder_path>[a-zA-Z_/ ]*): (?P<filename>[a-z]*.txt)$ 
관련 문제