正则表达式提取嵌套模式[重复]

2024-02-18

可能的重复:
在 Python 中将嵌套结构与正则表达式匹配 https://stackoverflow.com/questions/1099178/matching-nested-structures-with-regular-expressions-in-python

我无法解决这个问题。我有一个像下面这样的字符串:

Lorem ipsum dolor sit amet [@a xxx yyy [@b xxx yyy [@c xxx yyy]]] lorem ipsum sit amet

我的任务是提取命令(它们总是以[@并以]) 及其子命令。结果就像

[
    [@a xxx yyy [@b xxx yyy [@c xxx yyy]]], # the most outer
    [@b xxx yyy [@c xxx yyy]],              # the middle one
    [@c xxx yyy]                            # the inner most
]

将不胜感激。问题是这些类型的命令可能出现在很长的文本消息中,因此“高性能”的解决方案会很好。

我大部分时间都在玩弄一些正则表达式模式,比如

(\[@.*?\]\s) # for the outer one

但我没有看到匹配中间和内部的光。更复杂的是,嵌套命令的数量是可变的...... 一些特殊的正则表达式可能是解决方案吗?我读过有关前瞻和后视的内容,但不知道如何在这种特殊情况下使用它们。

谢谢一堆!

UPDATE

@Cyborgx37 向我指出了另一篇使用 pyparsing 包的帖子。如果有一个没有外部包或库的解决方案就好了。但 pyparsing 肯定解决了这个问题!


C# 有递归/嵌套正则表达式,我不相信 Python 有。您可以对以前的结果重新运行 RegEx 搜索,但这可能比仅仅创建自定义解析器效率低(RegEx 对于如此简单的搜索的开销)。您搜索“[@”和“]”的文本并不是很复杂。

这是一个可以完成这项工作的自定义解析器(JavaScript)。

var txt = "Lorem ipsum dolor sit amet [@a xxx yyy [@b xxx yyy [@c xxx yyy]]] lorem ipsum sit amet";
function parse(s) {
    var stack = [];
    var result = [];
    for(var x=0; x<s.length; x++) {
        var c = s.charAt(x);
        if(c == '[' && x+1 < s.length-1 && s.charAt(x+1) == '@') {
            for(var y=0; y<stack.length; y++)
                stack[y] += "[@";
            stack.push("[@");
            x++;
        } else if(c == ']' && stack.length > 0) {
            for(var y=0; y<stack.length; y++)
                stack[y] += "]";
            result.push(stack.pop());
        } else {
            for(var y=0; y<stack.length; y++)
                stack[y] += c;
        }
    }
    return result;
}
parse(txt);

它快速循环遍历文本的所有字符(仅一次),并使用堆栈和 if...if else...else 条件分别压入、弹出和修改堆栈中的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式提取嵌套模式[重复] 的相关文章

随机推荐

  • 如何录制屏幕并保存为gif动画? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有这样的软件吗 尝试这个名为 Cropper 的免费工具 无限帧 将输出设置为动画 Gif http cropper codeplex com htt
  • iOS 动画在 iOS7 中的我的应用程序中停止工作

    我发现我的应用程序中的所有 ios 动画都停止工作 这种情况在 iOS7 中非常频繁地发生 我有一个支持 iOS 5 6 和 7 的应用程序 最近我发现所有 iOS 动画在 iOS7 中的应用程序中都停止工作 在 IOS 7 中 当在后台线
  • EditTextPreference 禁用按钮?

    我想要一个 EditTextPreference 如果 EditText 字段中没有文本 它将禁用 确定 按钮 我创建了一个自定义 EditTextPreference 类 并且能够获取 EditText 对象并设置 TextWatcher
  • Nginx 不接受字节范围

    我正在使用 nginx 来提供文件系统中的视频 我想启用范围请求 目前这是我的文件返回的结果 curl I fileurl HTTP 1 1 200 OK Server nginx Date Sat 29 Mar 2014 06 41 41
  • 使用Ansible、Jenkins和docker构建快速测试环境

    我计划使用ansible jenkins和docker一起构建测试环境 计划是这样的 为您在环境中使用的每个工具创建 ansible 剧本并将其存储在 git 上 使用 jenkins create job 在开发服务器上创建 docker
  • 如何使用 EF 在 MVC Code-first 中更新/创建多对多关系数据?

    我仔细研究了 StackOverflow Google 和 asp net 试图找到一个清晰 基本的示例来说明如何做到这一点 所有的例子都是抽象的或涉及不适用的复杂情况 我没能从他们身上获得太多有用的东西 到目前为止 他们都没有完全回答我的
  • Spring RestTemplate 将响应流式传输到另一个请求中

    我正在尝试使用 spring 将文件下载的结果直接流式传输到另一篇文章中RestTemplate 我目前的方法如下 ResponseEntity
  • 为express.js更新Cookie会话

    我正在使用cookie会话 https github com expressjs cookie sessionExpress js 处理会话的模块 我希望在每次页面加载 或ajax调用 时更新会话 这就是他们通常在任何地方工作的方式 文档对
  • Python + Selenium:从“ng-bind”获取跨度值

    所以我有 Selenium 代码可以使用 chrome 访问页面 现在在该页面上有这样的 HTML span Heloooo span 如何使用 python 和 Selenium 获取值 所以只有Heloooo 谢谢 您可以使用以下 CS
  • $.proxy() 和 bind() 有什么区别?

    2009 年 ECMAScript 5 添加了一个内置的bind 函数接受一个对象作为参数并返回一个相同的函数 其中this将始终引用您传递给它的对象 我找不到任何看起来像规范文档链接的内容 这与jQuery 的 proxy 功能 http
  • 处理 Yesod 表单中的数据集合

    是否有可能在Yesod https en wikipedia org wiki Yesod web framework 处理包含数据集合的表单 我有一个用户可以添加多个人的表单 在前端它目前看起来像这样 people map person
  • 使用 AFNetworking 下载大文件

    我正在尝试实现大文件的下载并向用户显示当前进度 但阻止 AFURLConnectionOperation setDownloadProgressBlock 返回不正确bytesRead and totalBytesRead值 它们小于应有的
  • Hyperledger Fabric 的性能测试

    在尝试使用 Hyperledger Fabric 实现 IBM 团队在其文章中报告的性能期间Hyperledger Fabric 用于许可区块链的分布式操作系统 https arxiv org abs 1801 10228 我遇到了一些问题
  • 寻找跨平台开发的最佳 PCL 配置文件

    我正在努力扩展我的应用程序支持的平台数量 它曾经支持 NET4 Windows Store Windows Phone 但我希望也涵盖适用于 Android 和 iOS 的 Mono 我已将所有业务逻辑 模型和视图模型放入可移植类库 PCL
  • Blazor GetAsync 请求返回 401 状态代码

    我是 blazor 新手 尝试使用 NET Core EF Core 3 和 Visual studio 2019 创建一个应用程序 我已经设置了一个数据库模型和一个 API 用于获取所有地址 api Address 并在浏览器中浏览到此地
  • C# WinForm BackgroundWorker 不更新进度栏

    我在让后台工作人员更新进度条时遇到了一些麻烦 我使用在线教程作为示例 但我的代码无法正常工作 我在这个网站上进行了一些挖掘 但找不到任何解决方案 我对后台工作者 进度的事情很陌生 所以我不完全理解它 只是为了设置 我有一个主窗体 窗体 1
  • 传递到字典中的模型项的类型为“MyType”,但该字典需要类型为“MyType”的模型项

    是的 我浏览了类似标题的问题 它们似乎都不符合我所处的情况 这只是程序员向视图发送了错误的对象类型 这是我收到的确切错误消息 传递到字典中的模型项的类型为 IS Extensions Models ContactSelectList 但此字
  • Haskell 中的并发数据库连接池

    我是一名学习 Haskell 的 Java 程序员 我正在开发一个小型 Web 应用程序 该应用程序使用 Happstack 并通过 HDBC 与数据库进行通信 我写过select and exec函数 我这样使用它们 module Mai
  • 使用 onOptionsItemSelected 从 PreferenceActivity 和 PreferenceFragments 向上移动

    我使用时遇到问题onOptionsItemSelected使用 Android Studio 的默认 设置活动 extends AppCompatPreferenceActivity 活动的重要部分是 public class Settin
  • 正则表达式提取嵌套模式[重复]

    这个问题在这里已经有答案了 可能的重复 在 Python 中将嵌套结构与正则表达式匹配 https stackoverflow com questions 1099178 matching nested structures with re