正则表达式匹配python中的不同脚本标记

时间:2014-11-20 16:10:29

标签: python regex python-2.7

我需要匹配不同的脚本标签 例如像这样

 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
 <script type="text/javascript">
 jQuery(document).ready(function()
 {
    jQuery("#gift_cards").tooltip({ effect: \'slide\'});
 });
 </script>
 <script>dasdfsfsdf</script>

此外,我需要仅获取标签和组中的src内容 我创建了一个正则表达式

(<\s*?script[\s\S]*?(?:src=['"](\S+?)['"])?\B[\S\s]*?>)([\s\S]*?)(</script>)

这与最后一个脚本标记

不匹配

它有什么不对吗?

编辑: 删除\ B确实匹配所有脚本标记,但后来我不在单独的组中获取src属性的内容。我需要做的是从一组两个类别的脚本标签

  1. 具有src属性且具有实际脚本路径的一个
  2. 没有带正常内联javascript的src属性的第二个
  3. 我需要删除脚本开始和结束标记,但保留标记内的内容 如果它的第一个类型我仍然需要删除标签,但保持路径在一个单独的表中 希望能更明确地澄清它

3 个答案:

答案 0 :(得分:3)

作为iCodez&#39; link如此有趣地表明,HTML不应该被正则表达式解析,因为HTML不是常规语言。相反,请尝试使用BeautifulSoup之类的解析器。请务必同时安装lxmlhtml5lib以获得最佳性能并访问所有功能。

pip install lxml html5lib beautifulsoup4

应该这样做。

答案 1 :(得分:1)

前提是我同意所有关于不使用RegExp解析HTML的评论,并且当我确信我将处理的文档足够规则时,我自己也沉迷于这种邪恶的做法,请尝试删除{{1}在我的测试中它匹配所有三个脚本。

顺便说一下,这个“非边界”是什么?我不确定我理解你插入它的原因。如果由于某些原因我没有把握,请告诉我,我们会尝试寻找另一种方式。

编辑: 为了保留src内容,请尝试

\B

这适用于我,请检查您的其他样品。 当你没有“src”属性时,请考虑你的(<\s*?script[\s\S]*?(?:(?:src=[\'"](.*?)[\'"])(?:[\S\s]*?))?>)([\s\S]*?)(</scrip‌​t>) 已经匹配到first [\s\S]*?之前的所有内容,所以第二个只有“src”存在并且你想匹配其他可能的属性才有意义。

答案 2 :(得分:0)

对于咯咯笑,这是一个超级简单的方法,我通过完全意外发现(作为一个js字符串,它将被提供给RegExp构造函数:

&#39; SRC =(= | =&#34)&#39; + yourPathHere +&#39; [^&lt;]&lt; \ / script&gt;&#39;

其中yourPathHere有正斜杠转义;所以,作为一个纯粹的RE,像是:

/ SRC =(= | =&#34;)/脚本/ someFolder /的script.js [^&LT;]&LT; /脚本&GT; /

我正在使用gulp任务,而我正试图找出gulp流:[]