С тем, что под рукой:
import re
def sibling(bal,text):
print 'bal ==' + bal + '\n' # + '\n\n' + s
def aux(match):
# match.group(4) is '/' or None
return ("%s%s<%s'/>%s" % match.group(1,2,3,6) if match.group(4)
else "%s%s<%s'>%s'>%s" % match.group(1,2,3,5,6))
return re.sub('('
'(^\s*)<(' + bal + ')(?: [^/>]+)?' # 2 and 3
'(?:(/)|>(?:.*?)((?:(?:\n|\r\n?)\\2)?</\\3))' # 4 and 5
'>(\n|\r\n?|\Z)' # 6
')',
aux, text, flags = re.MULTILINE|re.DOTALL)
ch = """\
<a>
<b>
</b>
</a>
"""
dh = """\
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dd="http://example.com/ns/1.0" xml:lang="en-US">
<entry>
<dd:country_code>USA</dd:country_code>
<content type="html">Hello World!</content>
<OTF>
<FECS state="disabled" version="2.2.0.0">
<BackEndCompatibility major="2.2" state="disabled">
<BackEnd state="disabled" version="2.2.0.0"/>
<Forth type="ziwi">d,;%er*dkj@jkber-uyr</Forth>
</BackEndCompatibility>
</FECS>
</OTF>
</entry>
"""
print sibling('a',ch)
print '------------------------------------------------------'
print sibling('b',ch)
print '------------------------------------------------------'
for x in ('entry','dd:country_code','content','OTF','FECS',
'BackEndCompatibility','BackEnd','Forth'):
print sibling(x,dh)
print '------------------------------------------------------'
Результат:
bal ==a
<a>
<b>
</b>
</a>
<a'>
</a'>
------------------------------------------------------
bal ==b
<a>
<b>
</b>
<b'>
</b'>
</a>
------------------------------------------------------
bal ==entry
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dd="http://example.com/ns/1.0" xml:lang="en-US">
<entry>
<dd:country_code>USA</dd:country_code>
<content type="html">Hello World!</content>
<OTF>
<FECS state="disabled" version="2.2.0.0">
<BackEndCompatibility major="2.2" state="disabled">
<BackEnd state="disabled" version="2.2.0.0"/>
<Forth type="ziwi">d,;%er*dkj@jkber-uyr</Forth>
</BackEndCompatibility>
</FECS>
</OTF>
</entry>
<entry'>
</entry'>
------------------------------------------------------
bal ==dd:country_code
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dd="http://example.com/ns/1.0" xml:lang="en-US">
<entry>
<dd:country_code>USA</dd:country_code>
<dd:country_code'></dd:country_code'>
<content type="html">Hello World!</content>
<OTF>
<FECS state="disabled" version="2.2.0.0">
<BackEndCompatibility major="2.2" state="disabled">
<BackEnd state="disabled" version="2.2.0.0"/>
<Forth type="ziwi">d,;%er*dkj@jkber-uyr</Forth>
</BackEndCompatibility>
</FECS>
</OTF>
</entry>
------------------------------------------------------
bal ==content
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dd="http://example.com/ns/1.0" xml:lang="en-US">
<entry>
<dd:country_code>USA</dd:country_code>
<content type="html">Hello World!</content>
<content'></content'>
<OTF>
<FECS state="disabled" version="2.2.0.0">
<BackEndCompatibility major="2.2" state="disabled">
<BackEnd state="disabled" version="2.2.0.0"/>
<Forth type="ziwi">d,;%er*dkj@jkber-uyr</Forth>
</BackEndCompatibility>
</FECS>
</OTF>
</entry>
------------------------------------------------------
bal ==OTF
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dd="http://example.com/ns/1.0" xml:lang="en-US">
<entry>
<dd:country_code>USA</dd:country_code>
<content type="html">Hello World!</content>
<OTF>
<FECS state="disabled" version="2.2.0.0">
<BackEndCompatibility major="2.2" state="disabled">
<BackEnd state="disabled" version="2.2.0.0"/>
<Forth type="ziwi">d,;%er*dkj@jkber-uyr</Forth>
</BackEndCompatibility>
</FECS>
</OTF>
<OTF'>
</OTF'>
</entry>
------------------------------------------------------
bal ==FECS
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dd="http://example.com/ns/1.0" xml:lang="en-US">
<entry>
<dd:country_code>USA</dd:country_code>
<content type="html">Hello World!</content>
<OTF>
<FECS state="disabled" version="2.2.0.0">
<BackEndCompatibility major="2.2" state="disabled">
<BackEnd state="disabled" version="2.2.0.0"/>
<Forth type="ziwi">d,;%er*dkj@jkber-uyr</Forth>
</BackEndCompatibility>
</FECS>
<FECS'>
</FECS'>
</OTF>
</entry>
------------------------------------------------------
bal ==BackEndCompatibility
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dd="http://example.com/ns/1.0" xml:lang="en-US">
<entry>
<dd:country_code>USA</dd:country_code>
<content type="html">Hello World!</content>
<OTF>
<FECS state="disabled" version="2.2.0.0">
<BackEndCompatibility major="2.2" state="disabled">
<BackEnd state="disabled" version="2.2.0.0"/>
<Forth type="ziwi">d,;%er*dkj@jkber-uyr</Forth>
</BackEndCompatibility>
<BackEndCompatibility'>
</BackEndCompatibility'>
</FECS>
</OTF>
</entry>
------------------------------------------------------
bal ==BackEnd
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dd="http://example.com/ns/1.0" xml:lang="en-US">
<entry>
<dd:country_code>USA</dd:country_code>
<content type="html">Hello World!</content>
<OTF>
<FECS state="disabled" version="2.2.0.0">
<BackEndCompatibility major="2.2" state="disabled">
<BackEnd state="disabled" version="2.2.0.0"/>
<BackEnd'/>
<Forth type="ziwi">d,;%er*dkj@jkber-uyr</Forth>
</BackEndCompatibility>
</FECS>
</OTF>
</entry>
------------------------------------------------------
bal ==Forth
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dd="http://example.com/ns/1.0" xml:lang="en-US">
<entry>
<dd:country_code>USA</dd:country_code>
<content type="html">Hello World!</content>
<OTF>
<FECS state="disabled" version="2.2.0.0">
<BackEndCompatibility major="2.2" state="disabled">
<BackEnd state="disabled" version="2.2.0.0"/>
<Forth type="ziwi">d,;%er*dkj@jkber-uyr</Forth>
<Forth'></Forth'>
</BackEndCompatibility>
</FECS>
</OTF>
</entry>
------------------------------------------------------
Работает для 'a'
и
"""\
<a>
<b>
</b>
</a>
"""
, но не
"""\
<a>
<b>
</b>
</a>"""