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

2024-04-19 02:31:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

变成

^{pr2}$

以下是我目前所掌握的情况:

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 )

Tags: texttestresrc脚本urltypejs
2条回答

在不引起某些人的愤怒的情况下,您可以将其视为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)

给出:

^{pr2}$

此后,xml文档可能会有用;这完全取决于HTML有多漂亮和格式良好。在

您的表达式工作得很好;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>

您可以使用?使+*和{}限定符非贪婪;匹配最小值而不是最大值。您还可以将任何而不是的内容匹配为引号:

^{pr2}$

这会更好地约束正则表达式的这一部分;[^"]匹配任何一个双引号的字符。在

在指定正则表达式模式时,通常使用python原始字符串文本(r'')是个好主意,这样可以省去很多关于哪些内容需要转义,哪些内容不需要转义的麻烦。使用原始字符串文本,可以将替换模式简化为:

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

最后一行:

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

相关问题 更多 >