【问题标题】:Detect symbols that are not enclosed within double quotes (regex)检测未包含在双引号内的符号(正则表达式)
【发布时间】:2019-01-02 02:57:29
【问题描述】:

我想设计一个正则表达式,可以匹配用双引号括起来的字符[].\,();~-

例如这个字符串:

do Output.printString("Test 1: expected result: 5; actual result: ");

应该返回匹配项:

['.', '(', ')', ';']

我尝试使用负前瞻和负后瞻无济于事。

【问题讨论】:

  • 如果它是一个转义的字符串序列怎么办,例如do Output.printString("Test 1: expected result: 5; \"(actual)\" result: "); ?
  • 我认为仅在 Python 的正则表达式中这是不可能的。
  • 既然;在测试字符串中找到,为什么要返回它?
  • @zwer 没想到那么远,但最外面的双引号内的任何符号都不应该匹配
  • 找到所有引用的文本并删除它们,然后对这个修改后的字符串进行操作。

标签: python regex


【解决方案1】:

您可以将此正则表达式与前瞻一起使用,以确保匹配双引号外的符号:

>>> s = 'do Output.printString("Test 1: expected result: 5; actual result: ");'
>>> print re.findall(r'[][.,();~-](?=(?:(?:[^"]*"){2})*[^"]*$)', s)
['.', '(', ')', ';']

RegEx Demo

  • 如果给定的特殊字符在双引号之外,此正则表达式将通过使用前瞻来确保在匹配字符后有偶数个引号。
  • (?:[^"]*"){2} 找到一对引号
  • (?:(?:[^"]*"){2})* 找到 0 个或更多这样的对
  • [^"]*$ 确保我们在最后一个匹配的报价之后没有更多的报价

【讨论】:

    【解决方案2】:

    您需要两个步骤,因为 Python 正则表达式不够强大,无法一次性完成。

    re.findall(r'[\[\].\\,();~-]', re.sub(r'"(?:\\.|[^"\\])*"', '', s))
    # => ['.', '(', ')', ';']
    

    内部re.sub 删除所有双引号字符串(忽略转义的双引号);那么你就可以使用re.findall轻松获取你想要的东西了。

    【讨论】:

    • @marekful:哈哈,当你发表评论时,我的回答已经完成了一半,但可以肯定:)
    • 别担心!反正我是不会发布答案的。
    【解决方案3】:

    我们可以做类似的事情 -

    删除双引号内的文字

    import re
    pattern = u"[\"].*?[\"]"
    text = 'do Output.printString("Test 1: expected result: 5; actual result: ");'
    new_text = re.sub(ptrn, '', text)
    # O/P 'do Output.printString();'
    

    匹配您需要的所有字符

    pattern_2 = u"[\[\]\.\,\(\)\;\~\-]"
    matches = re.findall(pattern2, new_text)
    

    O/P ['.', '(', ')', ';']

    【讨论】:

      猜你喜欢
      • 2013-05-10
      • 2016-01-20
      • 2012-04-06
      • 2013-06-26
      • 2016-08-20
      • 1970-01-01
      • 2023-03-30
      • 2011-05-01
      • 1970-01-01
      相关资源
      最近更新 更多