【问题标题】:Python Regex matching certain characters that are not between quotesPython正则表达式匹配不在引号之间的某些字符
【发布时间】:2017-10-09 18:33:27
【问题描述】:

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

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

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

但是,当我申请时:

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

它也匹配引号之间的+,所以它输出:

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

我的预期输出是:

['+', '=']

我的问题是,我该如何做到这一点?甚至可能吗?我一直在网上冲浪,但只找到了如何匹配除双引号之外的所有内容,以及类似的。

【问题讨论】:

  • 不可能一次性完成。您需要首先消除所有引用的段(并正确处理任何嵌套的引号)。但这样做的目的是什么?看起来您正在尝试解析源代码,或者可能是算术语句。
  • 确实我正在尝试对源代码进行词法分析,所以我只想要我定义的标记,在这种情况下是类型符号的标记。问题是,当定义一个字符串时,我不知道如何处理它。我的猜测是和团体一起玩,但我不知道这是否是正确的道路......
  • 源代码是什么语言?如果是 python,请使用 tokenize

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


【解决方案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 的信息。

【讨论】:

    【解决方案2】:

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

    "

    会不会检查正则表达式,直到再次发生

    "

    来了

    【讨论】:

      猜你喜欢
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      相关资源
      最近更新 更多