检测未包含在双引号中的符号(正则表达式)

时间:2018-07-25 10:14:20

标签: python regex

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

例如,以下字符串:

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

应返回匹配项:

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

我尝试使用否定的前瞻性和否定性的后瞻无济于事。

3 个答案:

答案 0 :(得分:2)

您可以将此正则表达式与超前配合使用,以确保在双引号对之外匹配符号:

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

RegEx Demo

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

答案 1 :(得分:1)

您需要执行两个步骤,因为Python正则表达式的功能不足以一次性完成。

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

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

答案 2 :(得分:1)

我们可以做类似的事情-

删除双引号内的文本

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 ['.', '(', ')', ';']