2016-10-04 5 views
1

파이썬에서 정규 표현식을 사용하는 동안 시나리오를 발견했습니다. 문자열에 연산자가있는 경우 연산자 전후에 공백을 추가하고 싶습니다. 파이썬 정규 표현식 도트 문자

s = 'H>=ll<=o=wo+rl-d.my name!' 
op = 'H >= ll <= o = wo + rl - d.my name!' 

꽤 똑바로 앞으로 듯, 그래서 나는 다음과 같은 표현 해낸 :

re.sub(r'((<=)|(>=)|[+-=*/])+',' \\1 ',r'H>=ll<=o=wo+rl-d.myname!') 

하지만 내가 사용 얻고 결과 이것이다 :

'H >= ll <= o = wo + rl - d . my name!' 

그 공백 후 추가 모든 점 (.)은 정규식에서 언급하지는 않았지만 마주 치게됩니다.

저는 파이썬 2.7을 사용하고 있습니다.이 점에 대해 좀 더 알고 싶다면 정말 고맙겠습니다.

답변

7

점 주위의 공백은 -입니다. 콘크리트 [+-=]이며 +부터 =까지의 문자가있는 문자 클래스이며 .을 포함합니다.

이렇게하려면 -\-으로 이스케이프 처리해야합니다. @LaurentLAPORTE가 언급 한 바와 같이

re.sub(r'((<=)|(>=)|[+\-=*/])+',' \\1 ',r'H>=ll<=o=wo+rl-d.myname!') 

은 또한 시작 또는 문자 클래스의 끝 부분, 예를 들어,에 -을 넣을 수 있습니다 [-+=*/] 또는 [+=*/-] 모두 트릭을 수행합니다. 이 같은 문자 클래스를 수행 할 때

+2

'[+ = */-]'와 같이 범위 끝 부분에 "-"를 사용하거나 이스케이프시킬 수 있습니다. –

+0

어머, 나 얼마나 바보 야? 당연하지!!!. 고마워요 올라프 – vhora

+0

좋은 물건, 친구. 나는 결코 이것을 얻지 못했을 것이다. –

4

그래서 :

[+-=] 

정규식은 읽 + (ASCII 43)와 = (ASCII 61) 사이에 문자로. 에 그것은 유사 :

[A-Z] 

그래서 당신은 탈출해야하는 - :

r'((<=)|(>=)|[+\-=*/])+' 

(또는 의견 제안 끝에 -을 넣어 : [+=-])

Regex101이 매우 편리합니다 이런 정규식 패턴을 분석하기 위해. 당신은 내가 부정 세트를 사용하여이 조금 단순화 할 수 있었다 here

+0

Thanks @Charles, ** Regex101 ** 사이트의 멋진 팁 – vhora

0

당신의 패턴으로 문제를 볼 수 있습니다

import re 
s = 'H>=ll<=o=wo+rl-d.my name!' 
op = 'H >= ll <= o = wo + rl - d.my name!' 
s = re.sub(r'([^a-zA-Z0-9.])+',' \\1 ',r'H>=ll<=o=wo+rl-d.myname!') 
print (s) 

다른 덧글 위에서 이런 일이 이유를 언급이기 때문에 - '을 얻지 못한 당신이 의도 한대로 일하지 않습니다.

+0

감사합니다. @A_Eric은 부정적인 세트를위한 시나리오는 아니지만 선택한 연산자 만 바꾸면됩니다.여기에 설정된 부정은 당신의 목록에 언급 된 것 이외의 모든 문자를 대체합니다. – vhora