【问题标题】:Is there an equivalent to emacs' rx macro in python?python 中是否有等效于 emacs 的 rx 宏?
【发布时间】:2016-04-21 13:54:52
【问题描述】:

emacs 中的 rx 宏(参见 http://www.emacswiki.org/emacs/rxhttp://doc.endlessparentheses.com/Fun/rx)使得以模块化和可读的方式指定正则表达式成为可能(至少您不必关心引用问题)。例如:

(rx "a" (optional "c") "b")

结果

"ac?b"

python中有没有类似的东西?

【问题讨论】:

  • 我认为由于 Python 语法的低灵活性,很难做出类似的东西。 DSL 在 Python 中并不流行,通常只有 Java 风格的“构建器”。最接近的选择是 re.X""" 多行字符串。

标签: python regex emacs


【解决方案1】:

IMO,使用 LISP 语法定义 RegEx 不是经典用法。怎么能保持这种状态? RegEx 语言几乎是一种标准。几乎每个人都可以阅读; rx 不是。你知道Omnimark吗?它有一个漂亮但冗长的语法。现在忘记了……

为此,您可以定义简单的函数,例如:

def optional(regex):
    return regex + "?"


def regex(*args):
    return "".join(args)


REGEX = regex("a", optional("b"), "c")
print(REGEX)

你会得到:

ab?c

【讨论】:

  • 抱歉造成混淆 - 我并不是要表达我想在 Python 中使用 lisp 语法。而且,是的,您的示例演示了如何实现这样的包。但是,我并不打算自己实现这样的东西,而是很想知道它是否已经存在。而且,据我所知,在 emacs 中,使用 rx 并不少见。特别是因为它允许重用正则表达式来构建更大的正则表达式,否则您必须使用 concat 操作手动实现,这真的会变得很丑。
猜你喜欢
  • 1970-01-01
  • 2011-04-24
  • 2019-11-18
  • 2019-09-12
  • 2020-10-22
  • 2023-03-31
  • 1970-01-01
  • 2018-07-19
  • 2017-01-21
相关资源
最近更新 更多