【问题标题】:Parsing a regex-like string解析类似正则表达式的字符串
【发布时间】:2016-08-30 04:08:42
【问题描述】:

我正在尝试解析类似正则表达式的字符串,格式如下:

  • 唯一需要转义的字符是:[\-
  • 有效的字符串可以是以下序列:
    • “常规字符”,例如a, b
    • “转义的特殊字符”,例如\\, \[
    • 包含以上两个的序列,由一对括号括起来,例如[abc], [a\]]

例如,abc[def]gabc\-\[[def\]]gh\\ 都是有效字符串。

有什么方法可以在每个索引处获取字符/字符类(在上面的第三种情况下)?使用纯 regex/sed 或一些 Python 库对我有用。

【问题讨论】:

  • 可以得到每个索引处的字符/字符类(上面第三种情况)
  • 我也对你的问题感到困惑。它似乎可以解决你所拥有的已经有效的正则表达式,所以你可以将它用作正则表达式模式并完成它,但肯定不会那么容易,所以我真的不确定你是什么真的在问。
  • 对不起,我的意思是我的意思是基本上我可以得到单独的常规字符和字符组,例如abc[def]g 变为 [a,b,c, [d,e,f], g]。它比常规正则表达式更棘手,因为唯一需要转义的字符是[`, -. Therefore, if I have a string like `,它不是有效的正则表达式,而是此语法中的有效字符串。有了更多的想法,我想我会在 Python 中逐个字符地解析它。
  • 本质上,如果您支持转义,则应该允许所有字符。解析时,也要解析 escape + any character
  • @sln 是的,这就是我打算做的——所以如果我看到一个未转义的``,我会简单地解析下一个字符。

标签: python regex string sed grep


【解决方案1】:

通常,您不能逐个字符地解析它,而是必须解析它
逐个构造。

了解匹配的组可以告诉您构造是什么。
class 构造匹配时,您必须解析它的内容
与主正则表达式分开。

你会在(伪代码)中检查这一切

while(正则表达式查找)
{
如果第 1 组匹配 // 字符转义
其他
如果第 2 组匹配 // 非类开始或非转义字符
// 检查它是否应该被转义,或者是一个 metachar
其他
如果第 3 组匹配 // 类内容
// 在这里解析类内容
其他
如果第 4 组匹配 // 错误
}

例如目的..

(?s)(?:\\(.)|([^\[])|\[((?:\\.|[^\]])*)\]|(.))

展开

 (?s)                # Dot all modifier
 (?:
      \\                  # Escape anything
      ( . )               # (1)
   |                    # or,
      ( [^\[] )           # (2), Anything that does not start a char class
   |                    # or,
      \[                  # Start of char class
      (                   # (3 start)
           (?:                 # ----------
                \\ .                # Escape anything
             |                    # or,
                [^\]]               # Anthing that does not end a char class
           )*                  # ----------
      )                   # (3 end)
      \]                  # End of char class
   |                    # or,
      ( . )               # (4), Error, probably an unbalanced '['     
 )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-26
    • 2022-01-25
    • 2016-04-29
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多