【问题标题】:match everything except three consecutive double quotes匹配除三个连续双引号外的所有内容
【发布时间】:2019-07-09 15:20:16
【问题描述】:

我正在寻找一个正则表达式来解析除了三个连续的双引号之外的所有内容。问题是,当我使用正常的负前瞻时,连续的双引号会被吞噬,并且与我想要的不匹配。

假设我有以下文本:

Lorem Ipsum
"""
sdsdfgsdf
"""
bar

并且想linewise-regex 来匹配第一、第三和第五行,而不是"""

我尝试了以下正则表达式:/(?!""").*/,但那是双引号被吞噬的时候。 尝试使用 ["] 一次匹配一个双引号也失败了:/(?!["]["]["]).*/

我正在使用 Python 来匹配正则表达式。

有什么想法可以让这个正则表达式工作吗?

【问题讨论】:

  • re.findall(r'^(?!"{3}$).+', s, re.M)?见regex101.com/r/piWLvQ/1
  • 您想逐行处理您的输入,并且应该整理出只有 3 个连续双引号的行?进行字符串比较。
  • 如果是一行有四个双引号怎么办?
  • 看来你也可以简单地[x.strip() for x in s.split('"""')] (demo)。
  • 谢谢@WiktorStribiżew,但我需要一个正则表达式:)

标签: python regex pcre


【解决方案1】:

如果右侧不是""",则未锚定模式(?!""").* 将匹配任何字符0+ 次。由于它没有锚定,它将在""" 中的第一个" 之后匹配,因为在该位置断言将成功。

如果字符串中不能出现这 3 个双引号,您必须使用锚点 ^ 来断言字符串的开头,并将 .* 添加到负前瞻:

^(?!.*""").*$

或者,如果字符串中仅有 3 个连续的引号,则仅使用这些引号。

^(?!"""$).*$

Regex demo

【讨论】:

  • 更简单^(?!"{3}).*$
  • @frankegoesdown 当然也可以,""" 是 3 个字符 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 2011-05-30
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多