python - 在Python中用正则表达式替换html脚本元素源

标签 python regex escaping html-parsing shopify

我正在尝试编写一个大型 python/bash 脚本,它将我的 html/css 模型转换为 Shopify 主题。 此过程的一个步骤是更改所有脚本源。例如:

<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'

到目前为止我有两个问题:

  1. 我用来转义单个的一些反斜杠字符 我的正则表达式中的引号显示在输出中。

  2. 我的捕获组正在捕获整个原始源字符串,但是 我只需要最后一个“/”后面的内容

答案: 根据 Martijn Pieters 的有用建议,我查看了?正则表达式运算符,并提出了这个解决方案,完美解决了我的问题。另外,对于替换表达式,我将其封装在双引号中而不是单引号中,并转义了双引号,最终删除了不必要的反斜杠。谢谢大家!

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

最佳答案

你的表达效果很好; 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="([^"]+)"'

这更好地限制了正则表达式的该部分; [^"] 匹配任何非双引号的字符。

当指定正则表达式模式时,通常最好使用 python 原始字符串文字 (r''),这样可以避免很多关于什么需要转义以及什么需要转义的麻烦。不是。使用原始字符串文字,您的替换模式可以简化为:

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

最后一行:

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

关于python - 在Python中用正则表达式替换html脚本元素源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14983015/

相关文章:

java - 正则表达式拆分字符串上的转义序列无效

Python:如何以颜色打印变量的值

parsing - 当不可避免的字符被转义时该怎么办?

python 构造字典 {0 : [0, 0, 0], 1 : [0, 0, 1], 2 : [0, 0, 2], 3 : [0, 0, 3], ...,999 : [9, 9, 9]}

python - 如何使用 Flask 填充选择标签?

python - 带星号参数和不带星号参数的差异调用函数

regex - 是否可以使用正则表达式来匹配条件?

regex - 根据文件和文件夹名称的正则表达式匹配将文件复制到文件夹中

python - 在 Sublime Text 2 中显示当前函数的 Python 文档字符串?

javascript - 通过未转义的数据属性选择元素