2014-03-25 2 views
0

.cpp와 h의 라이브러리를 편집하는 파이썬 스크립트를 작성하고 있습니다. 파일. unity3d와 iOS 네이티브 플러그인의 모호함 때문에 나는 디렉토리 구조를 완전히 평평하게해야합니다. 그래서 나는 모든 파일을 통해 이동이을 변경해야합니다 .. 이것에파이썬은 줄에서 <(배타적)과 마지막/(포함) 사이의 텍스트를 제거합니다.

#include <Box2D/Dynamics/Joints/b2DistanceJoint.h> 

(예를 들어) ..

#include <b2DistanceJoint.h> 

을 그래서 난 사이에서 줄에서 텍스트를 제거하는 정규식 명령이 필요합니다 < 그리고 마지막/또한 아무런/아무 일도 일어나지 않으면 마지막/.Also를 제거합니다. (필요한 경우 if 문으로 처리 할 수 ​​있지만)

+2

모든 시도를 아직? – Jerry

+0

예,하지만 저는 주위를 날뛰고 있습니다. 나는 파이썬으로 꽤 녹슬지 않고 결코 실제로는 안된다. –

답변

2

시도가이 하나

code = '''#include <Box2D/Dynamics/Joints/b2DistanceJoint.h> 
#include <Box2D/Dynamics/Joints/xyz.h> #include <Box2D/Dynamics/Joints/xyz.h> 
#include <pqr.h>''' 

code = re.sub("(?:(?<=^)|(?<=[\n\r]))#include\s+<[^>]*/", "#include <", code) 

(?:(?<=^)|(?<=[\n\r]))#include이 줄의 시작 부분에만 있는지 확인합니다. 그것은 다른 #include

정규식 설명을 만지지 않도록 :

NODE      EXPLANATION 
-------------------------------------------------------------------------------- 
    (?<=      look behind to see if there is: 
-------------------------------------------------------------------------------- 
    ^      the beginning of the string 
-------------------------------------------------------------------------------- 
)      end of look-behind 
-------------------------------------------------------------------------------- 
|      OR 
-------------------------------------------------------------------------------- 
    (?<=      look behind to see if there is: 
-------------------------------------------------------------------------------- 
    [\n\r]     any character of: '\n' (newline), '\r' 
          (carriage return) 
-------------------------------------------------------------------------------- 
)      end of look-behind 
2

원한다면 정규식 없이도 해결할 수 있습니다 , 첫 번째 < char과 마지막사이의 슬라이스문자 : 물론

>>>s = "#include <Box2D/Dynamics/Joints/b2DistanceJoint.h>" 
>>>s[:s.find('<')+1] + s[s.rfind('/')+1:] 
'#include <b2DistanceJoint.h>' 

는, 어쩌면 당신은 당신이 그것을 그대로두고 싶을 것이다 가정이 경우, 어떤 /이없는 라인을 넘어, 그래서 당신이 있는지 확인하는 if 추가 할 수 있습니다 :

>>>s = "#include <Box2D/Dynamics/Joints/b2DistanceJoint.h>" 
>>>if s.rfind('/') >= 0: 
>>> s = s[:s.find('<')+1] + s[s.rfind('/')+1:] 
'#include <b2DistanceJoint.h>' 
3

사용

REgex Demo

가 쉬게이 정규식 여기 출력 rify : IDEONE

CODE :

import re 

text = """#include <Box2D/Dynamics/Joints/b2DistanceJoint.h>""" 
#print text 
print re.sub(r'<.*\/.*\/','<',text) 

OUTPUT :

#include <b2DistanceJoint.h>

+0

사실,'regex'는 꽤 간단하다. 나는 보통 내가 할 수있는 모든 것을 피하려고 노력한다. 그러나 그 것이 멋지다. –

+0

그래, 맞다. 내가 만들어야 만하는 변화는 괄호 안에 'print'다음에 내용을 넣었습니다. 감사합니다!, 감사합니다 Paulo. –

+0

실제로이 코드는 #include 와 같은 경우에만 작동합니다. –

1

이 같은 문자열이 작동하지 않습니다 실제로 받아 정규식 :

#include <Joints/b2DistanceJoint.h> 

regex101 demo

다음과 같이 조금 더 정규 표현식을 제안합니다 :

코드에서
<[^>]*/ 

regex101 demo

:

>>> import re 
>>> text = """#include <Box2D/Dynamics/Joints/b2DistanceJoint.h>""" 
>>> print re.sub(r"<[^>]*/", "<", text) 
#include <b2DistanceJoint.h> 
관련 문제