2013-02-20 2 views
1

내 HTML/CSS 모형을 Shopify 테마로 변환하는 큰 파이썬/bash 스크립트를 작성하려고합니다. 이 프로세스의 한 단계는 모든 스크립트 소스를 변경하는 것입니다. 예를 들어 : 밖으로파이썬에서 html 스크립트 요소 소스를 정규 표현식으로 바꾸기

import re 
test = """ 
    <script type="text/javascript" src="./js/jquery-1.8.3.min.js"></script> 
    <!--<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js" type="text/javascript"></script>--> 
    <script type="text/javascript" src="./js/ie-amendments.js"></script> 
    <script type="text/javascript" src="./js/jquery.bxslider.min.js"></script> 
    <script type="text/javascript" src="./js/jquery.colorbox-min.js"></script> 
    <script type="text/javascript" src="./js/main.js"></script> 
""" 
out = re.sub('src=\"(.+)\"', 'src="{{ \'\\1\' | asset_url }}"', test, flags=re.MULTILINE) 
out 

인쇄 지금까지이 문제가

'\n <script type="text/javascript" src="{{ \'./js/jquery-1.8.3.min.js\' | asset_url }}"></script>\n <!--<script src="{{ \'http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js" type="text/javascript\' | asset_url }}"></script>-->\n <script type="text/javascript" src="{{ \'./js/ie-amendments.js\' | asset_url }}"></script>\n <script type="text/javascript" src="{{ \'./js/jquery.bxslider.min.js\' | asset_url }}"></script>\n <script type="text/javascript" src="{{ \'./js/jquery.colorbox-min.js\' | asset_url }}"></script>\n <script type="text/javascript" src="{{ \'./js/main.js\' | asset_url }}"></script>\n' 

:

<script type="text/javascript" src="./js/jquery.bxslider.min.js"></script> 

여기
<script type="text/javascript" src="{{ 'jquery.bxslider.min.js' | asset_url }}"></script> 

내가 지금까지 무엇을 가지고이된다

  1. 내 정규식 내에서 단일 인용 부호를 이스케이프하는 데 사용하는 일부 백 슬래시 문자가 출력에 표시됩니다.

  2. 내 캡처 그룹은 전체 원본 문자열을 캡처

    하지만 난 그냥 지난 다음에 오는 것을 필요

  3. "/"

는 답변 : 마티 피에 터스 도움이 제안 당 , 나는 체크 아웃 ? 정규식 연산자, 그리고 내 문제를 완벽하게 해결이 솔루션을 내놓았다. 또한, 대체 표현식을 위해, 나는 그것을 단식과 반대로 큰 따옴표로 묶었 고, double을 이스케이프 처리하여 불필요한 백 슬래시를 제거했습니다. 고마워요!

re.sub(r'src=".+?([^/]+?\.js)"', "src=\"{{ '\\1' | asset_url }}\"", test, flags=re.MULTILINE) 
+1

* Sigh * http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – Cfreak

+1

@Cfreak : 제한된 경우 일 수 있습니다. 스크립트 태그는 다른 태그를 포함하지 않으며'src' 속성 매칭은 제한적이고 규칙적입니다. 여기 무릎을 꿇을 필요가 없습니다. –

+0

@Cfreak : 실제로 HTML을 구문 분석하기 위해 regexes가 좋지 않다는 것을 알지 못했습니다. 링크 주셔서 감사합니다 - 그것은 매우 유익했습니다! –

답변

1

표현식이 정상적으로 작동합니다. 파이썬은 대신 문자열 리터럴을 보여 주며, 파이썬 문자열로 다시 사용할 수 있도록 따옴표를 이스케이프해야합니다. 당신이 값을 인쇄 할 경우

는, 이러한 이스케이프는 장소도 취하지 않는다 :

>>> re.sub('src=\"(.+)\"', 'src="{{ \'\\1\' | asset_url }}"', test, flags=re.MULTILINE) 
'\n <script type="text/javascript" src="{{ \'./js/jquery-1.8.3.min.js\' | asset_url }}"></script>\n <!--<script src="{{ \'http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js" type="text/javascript\' | asset_url }}"></script>-->\n <script type="text/javascript" src="{{ \'./js/ie-amendments.js\' | asset_url }}"></script>\n <script type="text/javascript" src="{{ \'./js/jquery.bxslider.min.js\' | asset_url }}"></script>\n <script type="text/javascript" src="{{ \'./js/jquery.colorbox-min.js\' | asset_url }}"></script>\n <script type="text/javascript" src="{{ \'./js/main.js\' | asset_url }}"></script>\n' 
>>> print(re.sub('src=\"(.+)\"', 'src="{{ \'\\1\' | asset_url }}"', test, flags=re.MULTILINE)) 

    <script type="text/javascript" src="{{ './js/jquery-1.8.3.min.js' | asset_url }}"></script> 
    <!--<script src="{{ 'http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js" type="text/javascript' | asset_url }}"></script>--> 
    <script type="text/javascript" src="{{ './js/ie-amendments.js' | asset_url }}"></script> 
    <script type="text/javascript" src="{{ './js/jquery.bxslider.min.js' | asset_url }}"></script> 
    <script type="text/javascript" src="{{ './js/jquery.colorbox-min.js' | asset_url }}"></script> 
    <script type="text/javascript" src="{{ './js/main.js' | asset_url }}"></script> 

당신은 +, *? 예선을 만들기 위해 ?을 사용할 수 있습니다 비 욕심; 최대 값 대신 최소값과 일치합니다. 또한 하지 대신 견적 아무것도 일치시킬 수 있습니다 : 훨씬 더 정규 표현식의 부분을 제한

r'src="([^"]+)"' 

을; [^"]이 아닌 모든 문자와 일치합니다. 큰 따옴표.

정규 표현식 패턴을 지정할 때 일반적으로 파이썬 원시 문자열 리터럴 (r'')을 사용하는 것이 좋으며, 이스케이프 처리해야 할 대상과 필요하지 않은 대상에 대한 두통이 많이 저장됩니다.의 최종 라인

r'src="{{ \'\1\' | asset_url }}"' 

: 문자 그대로의 원시 문자열을 사용하여 대체 패턴을 단순화 할 수

re.sub(r'src="([^"]+)"', r'src="{{ \'\1\' | asset_url }}"', test, flags=re.MULTILINE) 
1

당신이 XML로 처리 할 수 ​​약간의 분노를 침해하지 않는 범위 내에서.

txt = """<html> 
<script type="text/javascript" src="./js/jquery.bxslider.min.js"></script> 
<script type="text/javascript" src="./js/jquery.another.min.js"></script> 
</html> 
""" 

import xml.etree.ElementTree as ET 
import os 
root = ET.fromstring(txt) 

for e in root.findall('script'): 
    e.attrib['src'] = "{{ '%s' | assert_url }}" % os.path.basename(e.attrib['src']) 

print ET.tostring(root) 

준다 :

<html> 
<script src="{{ 'jquery.bxslider.min.js' | assert_url }}" type="text/javascript" /> 
<script src="{{ 'jquery.another.min.js' | assert_url }}" type="text/javascript" /> 
</html> 

하는 XML 문서는 그 후 유용 할 수있다; 그것 모두는 HTML이 얼마나 멋지고 잘 형성되었는지에 달려 있습니다.

관련 문제