Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检测未包含在双引号(正则表达式)中的符号_Python_Regex - Fatal编程技术网

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

Python 检测未包含在双引号(正则表达式)中的符号,python,regex,Python,Regex,我想设计一个正则表达式,它可以匹配字符[].\,()~-

我想设计一个正则表达式,它可以匹配字符
[].\,()~-代码

例如,此字符串:

do Output.printString("Test 1: expected result: 5; actual result: ");
应返回匹配项:

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

我试着使用消极的先行和消极的后顾,但都没有用

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

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

内部
re.sub
删除所有双引号字符串(忽略转义的双引号);然后,您可以使用
re.findall
轻松获取所需内容。

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

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

内部
re.sub
删除所有双引号字符串(忽略转义的双引号);然后,您可以使用
re.findall
轻松获取所需内容。

我们可以执行以下操作-

删除双引号内的文本

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
[','(',),';']
我们可以做如下事情-

删除双引号内的文本

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
['、'('、')、';']
您可以将此正则表达式与一对双引号外的符号进行前瞻性匹配:

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

  • 如果给定的特殊字符在双引号之外,则该正则表达式将对这些字符进行拆分,方法是使用前向函数确保匹配字符后有偶数个引号
  • (?:[^“]*”{2}
    查找一对引号
  • (?:(?:[^“]*”{2})*
    找到0个或更多这样的对
  • [^”]*$
    确保在上次匹配的报价之后,我们没有更多的报价

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

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

  • 如果给定的特殊字符在双引号之外,则该正则表达式将对这些字符进行拆分,方法是使用前向函数确保匹配字符后有偶数个引号
  • (?:[^“]*”{2}
    查找一对引号
  • (?:(?:[^“]*”{2})*
    找到0个或更多这样的对
  • [^”]*$
    确保在上次匹配的报价之后,我们没有更多的报价

如果是转义字符串序列,例如,
do Output.printString(“测试1:预期结果:5;\”(实际)\“结果:”)?我认为仅在Python的regexp中是不可能的。为什么要
返回,因为它在测试字符串中找到了?@zwer不认为太远,但是最外面的双引号中的任何符号都不应该匹配查找所有带引号的文本并删除它们,然后对这个修改过的字符串进行操作。如果它是一个转义字符串序列,例如,
do Output.printString(“测试1:预期结果:5;\”(实际)\“结果:”)
?我认为这在Python的regexp中是不可能的。既然在测试字符串中找到了
,为什么要返回它呢?@zwer不这么认为,但是最外层双引号中的任何符号都不应该匹配查找所有带引号的文本并删除它们,然后对这个修改过的字符串进行操作。@marekful:哈哈,我有点烦了当你发表评论时,我给出了我的答案,但肯定:)别担心!反正我也不会发布答案。@marekful:哈哈,当你发表评论时,我的答案已经完成了一半,但肯定:)别担心!反正我也不会发布答案。