我对正则表达式不太满意,我正在寻找排除某些东西的语法。
我正在解析html代码中的<
,>
,"
和&
(替换为<
等),我需要排除{{1从解析。
即:
<br/>
我尝试了类似于:<html><br/>
<head><title></title></head><br/>
<body><br/>
</body><br/>
</html>
和其他人,但他们并没有完全发挥作用。我使用r'<\b?![br]'
替换。
答案 0 :(得分:2)
好的,现在问题再次打开,我可以作为答案,所以......
除非我遗漏了某些内容,并且只有<br/>
(不是任何变体),否则只需将<(?!br/>)
替换为<
,将(?<!<br/)>
替换为{{1}那就是它?
在Python中,它看起来像这意味着:
>
为了解释发生了什么,text = re.sub( '<(?!br/>)' , '<' , text )
text = re.sub( '(?<!<br/)>' , '>' , 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>
<html>
<br>
<title>"War & Peace"</title>
<body>Leon Tolstoy</body>
<br/>
</html>