2013-03-06 5 views
1

파이썬 정규식 구문을 지원하는 응용 프로그램을 사용하여 직장에서 일부 파일 이름 바꾸기를 돕고 있습니다. 아래의 a)에 대한 ^[^_]+(?=_)과 같은 포럼에서 발견 된 몇 가지 표현을 시도했지만 제대로 작동하지 않았으며 일부는 작동하지 않았습니다. 그래서, 나는 그들이 실제로하고있는 것을 실제로 알고있는 누군가에게 손을 내밀어 야한다고 생각했습니다. 당신의 도움을 주셔서 감사합니다.파이썬 정규식 3 개 밑줄

A) 나는이 같은 패턴의 첫 번째 밑줄 전에 모든 문자를 찾을 수있는 첫 번째 표현식에서 :

cannon_mac_23567_prsln_333 
jones_james_343342_prsln_333 
smith_john_223462_prsln_333 

그래서, 나는 대포, 존스 얻을 수 있고, 스미스

B) 별도의 표현식에서 첫 번째와 두 번째 밑줄 사이의 모든 문자를 찾아야합니다. 그래서 위의 예제에서 mac, james 및 john을 찾아야합니다. 마지막 표현

c)는 내가 처음 밑줄

이름 변경 응용 프로그램은 내가 위처럼 세 부분으로 이러한 정규 표현식을 할 필요가 작동하는 방식을 찾아야한다. 감사.

+0

당신은 각 부분에 대한 시도했다 표시해야합니다의 튜플. 어떻게 당신의 시도는 효과가 없었습니까? – askewchan

+0

내 대답이 업데이트되었습니다. 지금 원하는 것을해야합니다. – msvalkon

답변

1

내가 사용하십시오 :

1. ^([^_]+)_ 
2. _([^_]+)_ 
3. ^[^_]_ 

re.match를 사용하여, 문자열의 시작 부분과 일치한다.

[편집 : 크 툴루는 지적이 문자열 방법을 사용하여 빠르고 쉽게, 당신은이에 대한 정규 표현식을 사용하지 않는 더 좋을 수도]

+0

을 사용하지 않는 것이 좋습니다. 고맙습니다! 내 요청에 실수 한 건데. 2 단계에서 후행 밑줄을 포함 할 수 있습니까? 예를 들어, "james"대신 "james_"가 발견 될 것입니다. – user2141579

+0

그런 경우 외부 대신 괄호 안의 밑줄을 _ _ 삽입해야합니다. – Mariano

3

글쎄, 당신은 을 알고 있으므로으로 구분 기호가 밑줄이므로 정규 표현식 없이도 할 수 있습니다.

str.splitindex 방법을 사용하십시오.

'smith_john_223462_prsln_333'.split('_')[0] //(to extract smith) 
'smith_john_223462_prsln_333'.split('_')[1] //(to extract john) 
'smith_john_223462_prsln_333'.index('_') //(to get position of first underscore) 
+0

감사하지만 정규식이어야합니다. 파이썬 정규식 구문을 지원하는 파일 이름 바꾸기 데스크톱 응용 프로그램을 사용하고 있습니다. 실제로 파이썬 – user2141579

1

오른쪽, 내가 처음에 질문을 오해. str.split이이를 해결하는보다 세련된 방법 일 것이지만, 여기에 세 가지 정규 표현식이 필요합니다. 이 응용 프로그램을 사용할지 여부는 알지 못합니다. 소금 한 알을 가지고 이것을 섭취하십시오.

자세한 내용은 re 라이브러리 및 MatchObject.span()을 참조하십시오. A, B, C에

import re 
line = "cannon_mac_23567_prsln_333" 
In [1812]: match = re.match(r"(.+?)(\_)(.+?)\_", line) 

In [1813]: match.groups() 
Out[1813]: ('cannon', '_', 'mac') 

In [1814]: match.span(2)[0] <-- second group, start. The first occurence of _ 
Out[1814]: 6 

In [1815]: line[6] 
Out[1815]: '_' 

Seprated :

A :

import re 
line = "cannon_mac_23567_prsln_333" 
In [1707]: match = re.match(r"(.+?)\_", line) 

In [1708]: match.groups() 
Out[1708]: ('cannon',) 

B :

In [1712]: match = re.match(r".+\_(.+?)\_", line) 

In [1713]: match.groups() 
Out[1713]: ('prsln',) 

C : 마지막 하나 정규식로서

단순화를 위해 re.search를 사용합니다.MatchObject.span() 반환 위치 (start, end)

In [1763]: match = re.search("\_", line) 

In [1764]: match.span()[0] 
Out[1764]: 6 

In [1765]: line[6] 
Out[1765]: '_'