首页 文章

检测未用双引号括起来的符号(正则表达式)

提问于
浏览
1

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

例如,这个字符串:

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

应该返回匹配:

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

我尝试使用负向前瞻和负面观察无济于事 .

3 回答

  • 1

    我们可以做类似的事情 -

    Remove text inside double quotes

    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();'
    

    Match all characters you need

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

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

  • 2

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

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

    内部 re.sub 删除所有双引号字符串(忽略转义的双引号);然后你可以使用 re.findall 轻松拿起你想要的东西 .

  • 1

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

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

    RegEx Demo

    • 这个正则表达式将拆分给定的特殊字符,如果它们在双引号之外,则使用前瞻以确保在匹配的字符后有偶数引号 .

    • (?:[^"]*"){2} 找到一对引号

    • (?:(?:[^"]*"){2})* 找到0个或更多这样的对

    • [^"]*$ 确保我们在最后一个匹配的报价后没有任何报价

相关问题