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

标签 python regex string python-2.7 regex-negation

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

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

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

但是,当我申请时:

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

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

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

我的预期输出是:

['+', '=']

我的问题是,我该如何实现这一目标?有可能吗?我一直在网上冲浪,但只找到了如何匹配除双引号之类的所有内容。

最佳答案

首先,您不需要转义字符类中的每个特殊字符(不考虑 [])。所以你最初的表达就变成了……。像:

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

现在到第二个要求:匹配某些位置(并保留一些原样)。在这里,您可以使用较新的 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的更多信息.

关于Python正则表达式匹配不在引号之间的某些字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46652892/

相关文章:

python - 如何在groupby之后将数据框中的行值转换为Python中的列标签?

python - 如何替换模板文件中变量名的一部分

python 正则表达式只匹配最后一次出现

.net - 正则表达式:前瞻和后视,检查 . (点)用作十进制与句号

python - Pandas:按 value_count 获取匹配组的索引行

python - 如何使用 python 在 Windows 64 位中调用 32 位 exe?

java - 在 Java 中使用正则表达式获取 n 个单词

java - 尝试创建字符串

c# - 有什么方法可以找到最近的匹配项

string - PowerShell将每个字符串部分设置为变量以供重用