python中的正则表达式排除

时间:2011-09-04 18:46:39

标签: python regex

我对正则表达式不太满意,我正在寻找排除某些东西的语法。 我正在解析html代码中的<>"&(替换为&lt;等),我需要排除{{1从解析。 即:

<br/>

我尝试了类似于:<html><br/> <head><title></title></head><br/> <body><br/> </body><br/> </html> 和其他人,但他们并没有完全发挥作用。我使用r'<\b?![br]'替换。

3 个答案:

答案 0 :(得分:2)

好的,现在问题再次打开,我可以作为答案,所以......

除非我遗漏了某些内容,并且只有<br/>(不是任何变体),否则只需将<(?!br/>)替换为&lt;,将(?<!<br/)>替换为{{1}那就是它?


在Python中,它看起来像这意味着:

&gt;


为了解释发生了什么,text = re.sub( '<(?!br/>)' , '&lt;' , text ) text = re.sub( '(?<!<br/)>' , '&gt;' , text ) ... (?!是一个负向前瞻 - 如果以下文字匹配子表达式,它只能在某个位置成功匹配包含的内容。
(注意前瞻不会消耗与其子表达式匹配的文本,它们只会验证它是否存在。)

同样地,) ... (?<!背后的负面外观,并使用前面的文字做同样的事情。

然而,lookbehinds与前瞻略有不同(在一些正则表达式实现中) - 这就是lookbehinds中的子表达式必须代表固定宽度或有限宽度的匹配。

Python是需要固定宽度的一个 - 所以虽然上面的表达式有用(因为它总是四个字符),如果它是)那么它就不是Python的有效正则表达式,因为它代表可变长度匹配。 (但是,可以堆叠多个lookbehinds,因此如果有必要,您可以手动迭代各种选项。)

答案 1 :(得分:0)

替换所有内容,然后在第二遍中替换“&amp; lt; br /&amp; gt;”用“&lt; br /&gt;”。

或者,为了概括,请列出要“恢复”的标签列表并替换“&amp; lt; tag&amp; gt;” “&lt; tag&gt;”,“&amp; lt; / tag&amp; gt;” “&lt; / tag&gt;”和“&amp; lt; tag /&amp; gt;” “&lt; tag /&gt;”。

答案 2 :(得分:0)

这是否符合您的需求? :

import re
import htmlentitydefs

ss = '''
<html>
    <br>
        <title>"War & Peace"</title>
        <body>Leon Tolstoy</body>
    <br/>
</html>'''

print ss
print '\n\n'


uniquechars_repl = '"&'
conditional_repl = {'<':'<(?!br/>)',
                    '>':'(?<!<br/)>'}

all_repl = list(uniquechars_repl) + conditional_repl.keys()

di = dict( (b,'&%s;' % a) for a,b in htmlentitydefs.entitydefs.iteritems()
           if b in all_repl)

pat = '|'.join(list(uniquechars_repl) + conditional_repl.values())

text = re.sub(pat , lambda mat: di[mat.group()], ss )

print text

结果

<html>
    <br>
        <title>"War & Peace"</title>
        <body>Leon Tolstoy</body>
    <br/>
</html>




&lt;html&gt;
    &lt;br&gt;
        &lt;title&gt;&quot;War &amp; Peace&quot;&lt;/title&gt;
        &lt;body&gt;Leon Tolstoy&lt;/body&gt;
    <br/>
&lt;/html&gt;