Python正则表达式匹配不在引号之间的某些字符

时间:2017-10-09 18:33:27

标签: python regex string python-2.7 regex-negation

我正在尝试从字符串中提取标记,以使这些标记符合某些条件。在我的特定情况下,我想提取诸如+,=, - 等符号

我创建了以下正则表达式:

reg = re.compile(r"[\{\}\(\)\[\]\.,;\+\-\*\/\&\|<>=~]")

但是,当我申请时:

reg.findall('x += "hello + world"')

它也匹配引号之间的+,因此输出:

['+', '=', '+']

我的预期输出是:

['+', '=']

我的问题是,我该如何实现这一目标?它甚至可能吗?我一直在互联网上冲浪,但只发现如何匹配除了双引号之外的所有东西,以及类似的东西。

2 个答案:

答案 0 :(得分:1)

首先,您不需要转义字符类中的每个特殊字符(放开[])。所以你的初始表达式变成了......像:

[-\[\]{}().,;+*/&|<>=~]

现在达到第二个要求:在某些位置匹配(并保留一些原样)。在这里,您可以使用较新的regex模块并编写(demo on regex101.com):

"[^"]+"(*SKIP)(*FAIL)|[-\[\]{}().,;+*/&|<>=~]

<小时/> 或者使用括号与较旧的re模块和一些编程逻辑:

import re

rx = re.compile(r'"[^"]+"|([-\[\]{}().,;+*/&|<>=~])')

string = 'x += "hello + world"'

symbols = [match.group(1) for match in rx.finditer(string) if match.group(1)]
print(symbols)

<小时/> 两者都会产生

['+', '=']

<小时/> 这些方法遵循以下机制:

match_this_but_dont_save_it | (keep_this)

您可能希望详细了解(*SKIP)(*FAIL) here

答案 1 :(得分:0)

我认为你可以做一件事你可以限制一次

  

&#34;

直到另一次出现

,它才会检查正则表达式
  

&#34;