我想设计一个正则表达式,可以匹配不用双引号引起来的字符[].\,();~-
。
例如,以下字符串:
do Output.printString("Test 1: expected result: 5; actual result: ");
应返回匹配项:
['.', '(', ')', ';']
我尝试使用否定的前瞻性和否定性的后瞻无济于事。
答案 0 :(得分:2)
您可以将此正则表达式与超前配合使用,以确保在双引号对之外匹配符号:
>>> s = 'do Output.printString("Test 1: expected result: 5; actual result: ");'
>>> print re.findall(r'[][.,();~-](?=(?:(?:[^"]*"){2})*[^"]*$)', s)
['.', '(', ')', ';']
(?:[^"]*"){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 ['.', '(', ')', ';']