1

html/cssモックアップをShopifyテーマに変換する大きなpython/bashスクリプトを作成しようとしています。このプロセスの1つのステップは、すべてのスクリプトソースを変更することです。例えば:

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

になります

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

これが私がこれまでに持っているものです:

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'

これまでに2つの問題があります。

  1. 正規表現内の一重引用符をエスケープするために使用しているバックスラッシュ文字の一部が出力に表示されます。

  2. 私のキャプチャグループは元のソース文字列全体をキャプチャしていますが、最後の「/」の後に続くものが必要です。

答え:Martijn Pietersの役立つ提案ごとに、私は?をチェックしました。正規表現演算子、そしてこの解決策を思いついた、それは私の問題を完全に解決した。また、置換式については、シングルではなくダブルクォートでカプセル化し、ダブルをエスケープしたため、不要なバックスラッシュが削除されました。みんなありがとう!

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

2 に答える 2

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がどれほど素晴らしく整形式であるかに依存します。

于 2013-02-20T19:40:45.320 に答える
1

あなたの表現はうまく機能しています。Pythonは、代わりに文字列リテラルを表示しているだけです。Python文字列として再利用するには、引用符をエスケープする必要があります。

値を出力すると、そのようなエスケープは行われません。

>>> 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''代わりにpython raw文字列リテラル()を使用することをお勧めします。これにより、エスケープが必要なものと不要なものに関する多くの問題を回避できます。生の文字列リテラルを使用すると、置換パターンを次のように簡略化できます。

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

最終行の場合:

re.sub(r'src="([^"]+)"', r'src="{{ \'\1\' | asset_url }}"', test, flags=re.MULTILINE)
于 2013-02-20T15:14:49.890 に答える