【问题标题】:Pull regex match without its environment [duplicate]在没有环境的情况下拉正则表达式匹配[重复]
【发布时间】:2016-07-13 05:28:44
【问题描述】:

我想在 Python 中匹配给定表达式之间出现的任何内容。例如:

dogdogacowadogdog  <-- search a word between 'a' characters
<span>tiger<a>      <-- search for sth between <span> and <a>

我想只匹配这个 something 之间的东西,所以它分别是 cowtiger。但是,当使用 reexes 时:

r'a(.*)a'
r'<span>(.*)<a>'

它会打印整行,而不仅仅是我要查找的内容(与 (.*) 匹配的内容)。如何获取这些信息?

【问题讨论】:

  • 听起来你想要(.*?)(惰性匹配)。另外我希望你不是用正则表达式解析 HTML...
  • 你使用的是哪个re函数?
  • 你必须使用捕获组。
  • @OrangeFlash81: match = re.search(regex, text)

标签: python regex


【解决方案1】:

您要查找的正则表达式是 non-greedy 匹配。

什么是非贪婪匹配?

.*.+.? 尝试匹配尽可能多的字符。在这些字符尝试匹配尽可能少的字符后添加问号 (?)。 .*? 将匹配 0 个字符(如果可以),.+? 将匹配 1 个字符。

回到你的问题,你应该使用它作为你的正则表达式查询:

r'a(.*?)a'
r'<span>(.*?)<a>'

接下来是匹配本身

如果您使用match =re.search(),您需要获得match.group(1) 而不是match.group(0) 才能接收群组本身。

match.group(0)给出了整场比赛(包括小组前后的部分)。

match.group(1) 只给出第一组。

match.groups() 但是只取出组(不是整场比赛),所以match.groups()[0] 将是第一组。

【讨论】:

  • 您能简单解释一下为什么应该使用 .group(1) 而不是 .group(0) 吗?
  • group(0) 是整个匹配,即第一个捕获组
  • @BartłomiejSzałach 在答案中进一步解释。这些链接引用了re 文档中的正确部分,以进一步解释该行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 2014-09-05
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
相关资源
最近更新 更多