【问题标题】:Match regex string, but also return optional leading whitespace匹配正则表达式字符串,但也返回可选的前导空格
【发布时间】:2018-05-24 18:10:25
【问题描述】:

想象一下,我有一个多行字符串,其中包含格式为 {{ string_a }} 的标记,并且可以放置在它们自己的行上(可能有前导空格),或者与其他标记放在同一行上。

a: {{ string_a }}

b:
  {{ string_b }}

我正在尝试编写一个匹配这些标记的内容并进行替换的正则表达式,但我还想根据它们是否存在于自己的行上运行一些条件逻辑。

我的原始正则表达式非常基本:\{\{\s*([A-Za-z_]+)\s*\}\},它在匹配标记方面做得很好。但是,当我尝试匹配前导空格并将其放入捕获组时,它只匹配那些有空格的,而我真的想要所有的标记,不管:

(^\s*)\{\{\s*([A-Za-z_]+)\s*\}\}

我想解决方案是使用某种前瞻/后瞻,但无论我尝试哪种方式,它似乎都失败了。不确定这是因为第一组中的^ 还是*,但无论如何它都不喜欢。

所以,我想要获取的捕获列表如下:

  • 完整令牌{{ string_a }}
  • 内弦string_a
  • 空格与否\s\s\s,在上面做布尔条件逻辑

【问题讨论】:

  • Python 标记,因为它是 pythonic 正则表达式语法,但如果看起来没有必要,可以删除
  • 没关系,实际上我们基本上要求所有regex问题也指定语言或平台,最好使用合适的标签。
  • 如果它在字符串的开头是一个可选空格,你不能用(\s)?开始你的正则表达式
  • 这看起来很可疑,就像您正在尝试使用正则表达式解析 YAML 或其他一些结构化格式。不要那样做。 Google for cthulhu zalgo html。
  • 是的,我已经在 SO 上工作了 6 年多了,我看过 cthulhu 的帖子 ;)

标签: python regex


【解决方案1】:

试试(^\s*)?\{\{\s*([A-Za-z_]+)\s*\}\}。唯一的区别是单个?

(^\s*) 的问题在于 ^ 不是可选的。

【讨论】:

  • 啊,这很简单,应该很明显!周一早上 9 点前的咖啡前大脑是罪魁祸首。试图让lookbehinds过于复杂。谢谢
  • 顺便说一下,转义 {} 仅在解析器不明确时才需要。 (^\s*)?{{\s*([A-Za-z_]+)\s*}} 也同样有效。
  • 是的,我只是出于习惯而已。快速的额外问题,似乎我的re.finditer 实际上与空白组不匹配。总是以None 出现。有没有我失踪的标志?干杯
  • m 标志我可以告诉。
  • 哦。欣赏它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 2019-10-14
  • 2016-12-20
  • 2012-03-11
  • 1970-01-01
相关资源
最近更新 更多