2014-12-30 2 views
0

이 질문에 대해서는 대체 파이썬 메서드에 관심이 없습니다. 코드에만 Regex를 적용하는 데 관심이 있습니다. 왜 작동하지 않는지 나는 알 수 없다.주어진 패턴 앞의 문자 제외

의 나는 다음과 같은 문자열이 있다고 가정 해 봅시다 : 나는 그것을 전에 첫 번째를 제외하고, 점 전에 모든 문자를 제외한 모든 문자를 얻으려면

hello.world 

. 그래서, 나는 다음과 같은 문자열을 추출하기 위해 시도하고 :

o.world 

이 내 코드입니다 :

re.sub('^.*[^.\..*]', '', string) 
다음과 같이

내 정규식 로직은 분류됩니다 한 문자 다음에하지 않은 첫 번째 문자 ^.* 한 문자 다음에 임의 수의 문자 [^.\..*]이 제거됩니다.

그러나 Regex가 작동하지 않아 누군가 나를 도울 수 있습니까?

+0

이유는 다른 방법을 사용하지? –

+0

그냥 내 정규식이 작동하지 왜 궁금 해서요, 나는 그것에 자리를 가지고 있다고 생각 ... – Bolboa

+1

잘 FWIW's [s.index (".") - 1 :]'대략 30 배 빠름 –

답변

2

귀하의 패턴이 귀하가 생각하는 것과 일치하지 않으므로 현재 코드가 작동하지 않습니다. 문자 세트에 .*을 넣는 것은 "0 개 이상의 문자"를 의미하지 않습니다. 대신 문자 그대로 . 또는 *을 의미합니다. 또한 \.. (문자 집합에서 특별한 의미가 없으므로 .)이 아닌 \ 또는 .으로 처리됩니다. 일치

^.*[^\.*] 

:

이 당신의 패턴이 실제로 동등하다는 것을 의미

^  # The start of the string 
.*  # Zero or more characters 
[^\.*] # A character that is not \, ., or * 

re.sub 당신이 원하는 것을 수행하려면, 당신은 사용할 수 있습니다

>>> import re 
>>> re.sub('[^.]*(.\..*)', r'\1', 'hello.world') 
'o.world' 
>>> 

아래 패턴이 무엇을하는지에 대한 설명 :

[^.]* # Matches zero or more characters that are not . 
(  # Starts a capture group 
.  # Matches any character (save a newline). 
\.  # Matches a literal . 
.*  # Matches zero or more characters 
)  # Closes the capture group 

중요한 부분은 캡처 그룹입니다. 바꾸기 문자열 내에서 \1은 일치하는 문자열을 참조합니다.이 경우에는 유지하려는 텍스트입니다. 위의 코드는 모든 텍스트를 필요한 텍스트로만 바꾸는 것으로 볼 수 있습니다. 말했다


, 단지 re.search를 사용하는 것이 더 좋을 것 같아 : 훨씬 간단하고 훨씬 더 효율적인 경우

>>> import re 
>>> re.search('[^.]*(.\..*)', 'hello.world').group(1) 
'o.world' 
>>>