【问题标题】:re.findall return separate non-overlapping results [duplicate]re.findall 返回单独的非重叠结果[重复]
【发布时间】:2018-12-01 20:53:36
【问题描述】:

我是 Python 新手,我在使用正则表达式时有些吃力。如果我有这样的输入:

    text = <tag>xyz</tag>\n<tag>abc</tag>

是否可以获得包含以下元素的输出列表:

    matches = ['<tag>xyz</tag>','<tag>abc</tag>]

现在我正在使用以下正则表达式

    matches = re.findall(r"<tag>[\w\W]*</tag>", text)

但我得到的不是一个包含两个元素的列表,而是一个包含整个输入字符串的元素,例如:

    matches = ['<tag>xyz</tag>\n<tag>abc</tag>']

有人可以指导我吗? 谢谢。

【问题讨论】:

  • 使用惰性(或非贪婪)量词,将* 替换为*?
  • 我是正则表达式的新手,并不真正了解贪婪和非贪婪搜索。感谢您链接这些答案。但是*? 只返回最后一次出现。有没有办法捕获所有事件?
  • 返回所有匹配项。
  • 这是我的确切代码 matches = re.findall(r"&lt;paragraph&gt;[\w\W]*?&lt;/paragraph&gt;", file1) 。我做错了什么使它只返回最后一次出现吗?我正在尝试捕获多个 &lt;paragraph&gt;&lt;/paragraph&gt; 标签之间的数据

标签: python regex python-3.x findall


【解决方案1】:

你只需要让你的捕获不贪心。

更改此正则表达式,

<tag>[\w\W]*</tag>

<tag>[\w\W]*?</tag>


import re
text = '<tag>xyz</tag>\n<tag>abc</tag>'
matches = re.findall(r"<tag>[\w\W]*?</tag>", text)
print(matches)

打印,

['<tag>xyz</tag>', '<tag>abc</tag>']

【讨论】:

  • 感谢您的回答。但这样做只会给我该模式的最后一次出现而不是所有出现。您能否建议一种捕获所有事件的方法?
  • @ApoorvaPatil:在我的答案中尝试我的 python 代码。它准确地打印了我在那里写的内容。如果它不适合您,您可以编辑您的帖子并分享您正在尝试的代码吗?
猜你喜欢
  • 2017-05-16
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 2017-12-29
  • 2019-05-31
  • 1970-01-01
相关资源
最近更新 更多