【问题标题】:Python Regex to match optionally double-quoted stringPython正则表达式匹配可选的双引号字符串
【发布时间】:2018-09-10 19:35:38
【问题描述】:

我想使用 Python 正则表达式模块 re

将可选的双引号字符串与正则表达式匹配

表达式应该给出以下结果:

"Assets". => 应该匹配

Assets. => 应该匹配

"Assets. => 不应该匹配

Assets". => 不应该匹配

我尝试在正则表达式中使用反向引用来实现这一点:

("?)Assets\1 

但是,即使没有匹配的结束引号,它也会匹配。 "Assets. -> 忽略初始引号 ",并匹配单词的其余部分。

什么是正确的表达方式?

【问题讨论】:

  • 如果字符串包含转义怎么办(如"Foo \" Bar"?)
  • 无论你试图用正则表达式解析什么,都不应该用正则表达式解析。
  • 此外,如果中间有引号,例如Foo "" Bar等,还不清楚会发生什么。如果您尝试解析字符串literals,这是可能的使用正则表达式(尽管可能不建议这样做)。
  • 如何识别未引用值的开头和结尾?

标签: python regex


【解决方案1】:

您可以使用以下模式。请注意,它基本上列出了两种不同的情况,因为众所周知括号不是正则的,而是上下文相关的,因此很难用正则表达式处理:

>>> p = re.compile(r'^(?:"[^"]+"|[^"]+)$')
>>> bool(p.match('"assets"'))
True
>>> bool(p.match('"assets'))
False
>>> bool(p.match('assets'))
True

这也假设在被匹配的字符串之前或之后没有字符。

【讨论】:

    【解决方案2】:

    您的正则表达式模式几乎是正确的。你只需要确保你的模式前后没有引号。所以使用模式r'(?<!")("?)Assets\1(?!")

    >>> words = ['"Assets"', 'Assets', '"Assets', 'Assets"']
    >>> ptrn = re.compile(r'(?<!")("?)Assets\1(?!")')
    >>> [bool(ptrn.match(word)) for word in words]
    [True, True, False, False]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      相关资源
      最近更新 更多