使用正则表达式从python中的多行字符串中获取值

时间:2015-09-02 01:56:09

标签: python regex

我在这里看过非常相似的帖子,但我似乎无法让他们中的任何一个工作。

这是我的代码

import re

regex='<item>
<obj1>grab1</obj1>
<obj2>text<obj2>
...
</item>'
pattern=re.compile(regex)
searchfile=open('data.dat')
filetext=searchfile.read()
text=re.findall(pattern,filetext)
print text

我已尝试将\ n放入,因此字符串看起来像

regex='<item>\n
<obj1>grab1</obj1>\n
<obj2>grab2<obj2>\n
...
</item>'

但它不起作用。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

尝试以下

import re

regex = '''<item>
<obj1>grab1</obj1>
<obj2>text<obj2>
...
</item>'''

pattern = re.compile(regex)

with open('data.dat') as searchfile:
    filetext = searchfile.read()
    text = pattern.findall(filetext)
    print text

答案 1 :(得分:0)

多行字符串使用三个单引号或双引号作为分隔符。无需添加\n来表示新行。

您的代码将变为:

import re

regex='''<item>
<obj1>grab1</obj1>
<obj2>text</obj2>
</item>'''
pattern=re.compile(regex)
searchfile=open('data.dat')
filetext=searchfile.read()
text=re.findall(pattern,filetext)
print text

也就是说,你的正则表达式的第三行可能还有另一个错误:你忘了关闭<obj2>元素。

最后,如果你想解析XML文档,我不建议使用正则表达式。相反,您可能希望查看诸如lxml之类的库。

考虑以下文档data.dat

<document>
<item>
<obj1>grab1</obj1>
<obj2>text</obj2>
</item>
<otheritem></otheritem>
<item>
  <obj1>grab1</obj1>
  <obj2>text</obj2>
</item>
</document>

运行上面的python代码,你会得到: ['<item>\n<obj1>grab1</obj1>\n<obj2>text</obj2>\n</item>']

由于缩进,第二个<item>被忽略了。