用正则匹配所有'<twaver开头,所有</twaver>'结尾,中间包括任意字符还有换行空格,这个正则怎么写啊,有单引号


'<twaver v=''TWaver Java To Flex Version 1.0'' p=''flex''>
<dataBox type=''twaver.ElementBox''>
    <layerBox>
        <layer name=''default'' visible=''true'' editable=''true'' movable=''true''/>
        <layer id=''equipLayer'' name=''equipLayer'' visible=''true'' editable=''true'' movable=''true''/>
        <layer id=''labelLayer'' name=''labelLayer'' visible=''true'' editable=''true'' movable=''false''/>
        <layer id=''linkLayer'' name=''linkLayer'' visible=''true'' editable=''true'' movable=''true''/>
        <layer id=''portLayer'' name=''portLayer'' visible=''true'' editable=''true'' movable=''true''/>
    </layerBox>
</dataBox>
<data type=''twaver.Node'' ref=''0'' id=''AD5FFEC7-904B-4CC1-83FC-E25F7F67125E-00030''>
</twaver>'

匹配模式就直接'<twaver.*?</twaver>'就好,中间.*用非贪婪匹配
注:要是学过编译原理就知道,正则无法匹配成对的多层级元素,也就是说使用正则就要求字符串中标签是并列的,不能有嵌套发生

import re

string = '''
 '<twaver v=''TWaver Java To Flex Version 1.0'' p=''flex''>
<dataBox type=''twaver.ElementBox''>
    <layerBox>
        <layer name=''default'' visible=''true'' editable=''true'' movable=''true''/>
        <layer id=''equipLayer'' name=''equipLayer'' visible=''true'' editable=''true'' movable=''true''/>
        <layer id=''labelLayer'' name=''labelLayer'' visible=''true'' editable=''true'' movable=''false''/>
        <layer id=''linkLayer'' name=''linkLayer'' visible=''true'' editable=''true'' movable=''true''/>
        <layer id=''portLayer'' name=''portLayer'' visible=''true'' editable=''true'' movable=''true''/>
    </layerBox>
</dataBox>
<data type=''twaver.Node'' ref=''0'' id=''AD5FFEC7-904B-4CC1-83FC-E25F7F67125E-00030''>
</twaver>'
'''

obj = re.findall("'<twaver.*?</twaver>'", string, re.S | re.M)
print(obj)

re.compile(r'\'<twaver.*?>.*?</twaver>\'', re.S)
import re
pattern = re.complie('\'<twaver(.*?)</twaver>\'',re.S)
result = pattern.findall(text)

不要再用网站测试,网站无法表达Python中的正则匹配标识符,直接使用Python解释器测试。既然你需要使用Python,那么就应当在Python解释器的环境下使用正则匹配。

下面的代码就是正解,前几位回答者也是对的。

import re
t='''<twaver v=''TWaver Java To Flex Version 1.0'' p=''flex''>
<dataBox type=''twaver.ElementBox''>
    <layerBox>
        <layer name=''default'' visible=''true'' editable=''true'' movable=''true''/>
        <layer id=''equipLayer'' name=''equipLayer'' visible=''true'' editable=''true'' movable=''true''/>
        <layer id=''labelLayer'' name=''labelLayer'' visible=''true'' editable=''true'' movable=''false''/>
        <layer id=''linkLayer'' name=''linkLayer'' visible=''true'' editable=''true'' movable=''true''/>
        <layer id=''portLayer'' name=''portLayer'' visible=''true'' editable=''true'' movable=''true''/>
    </layerBox>
</dataBox>
<data type=''twaver.Node'' ref=''0'' id=''AD5FFEC7-904B-4CC1-83FC-E25F7F67125E-00030''>
</twaver>'''

pattern = re.compile('<twaver(.*?)</twaver>',re.S)
result = pattern.findall(t)
print(result)