在C#中实现Python的切割技术

在C#中实现Python的切割技术

前言

  之前在学习Python的时候发现Python中的切割技术超好玩的,本人也是正则表达式热爱狂,平时用C#比较多,所以决定把Python中的切割技术在C#中实现,添加到个人类库中,以便日后在写C#代码的时候能舔一舔Python的味道。

效果展示

             Python版:           C#版:

切割技术讲解

  这里先简要讲解一下Python中的切割技术,其他Python前辈也对此技术有丰富多彩的讲解文章,这里只是简要说明一下,好让读者们能知道下怎么回事,如果想更深入了解Python的切割技术,这里并不适合你哦。

  切割的对象可以是字符串或者序列,本文提供字符串的实现方法,其实序列差不多的,我也会在最后提供字符串和序列的实现代码,并且附带单元测试。

  好了,废话不多说,其实看了上面的Python版的结果,我想聪明的您就略知一二了。切割的模板是:变量[起始位置:终点位置:步长],举个例子:a="abcdfeghij",那么a[0:2:1]这个的结果就是零位置开始(a的左边),步长为1(也就是连续取),到2位置结束(从a的左边开始:0->(a的左边),1->(b的左边,a的右边),2->(c的左边,b的右边)->结束),好了,结果就是"ab"。

       注意事项:1.步长可以忽略不写(默认为1),如果步长为2,就每取一个跳过1个,以此类推。

            2.可以使用负数a[-3:-1:1],结果是"ef",读者们可以自己推一下,很简单。

            3.切割技术可以针对字符串,也可以针对序列。

  

实现过程

  这里需要用到正则表达式的技术,可能对一些朋友来说比较难懂,但是我会尽量讲解的简单一点。

  首先,要使用切割,有三个参数可以控制:起始位置,结束位置,步长。所以在正则表达式应该嵌入这三个参数变量,在匹配的时候动态生成正则表达式。下面来看需要把这三个参数放到哪里:

    起始位置:

        1.背景

            这里使用肯定逆序环视,什么是肯定逆序环视,就是匹配到的位置那一点向后看,向前看的内容必须符合环视的内容,举个例子:文本:abc
 ,正则表达式:(?<=a)b,肯定逆序环视符号:(?<=exp),这个正则表达式的意思就是找到b,然后向后看(左边),如果是a就匹配成功,结果就是b(因为逆序环视是不纳入结果中)。

          2.实现

            我使用[\s\S]来表示一个任意符号,含有位置参数的部分放到左边,形成这样一个正则表达式:

(?<=^[\s\S]{StarIndex,})[\s\S] 
注意这里的StarIndex是变量,可以是0,1,2,3..!以StarIndex=2(其实位置是2)为例,匹配一个任意字符,并且向后看(左边)是开头->2个或者多个任意字符。

    结束位置:

         1.背景

            这里使用肯定顺序环视,什么是肯定顺序环视,就是匹配到的位置那一点向前看,向前看的内容必须符合环视的内容,举个例子:文本abc
,正则表达式:(?=b)a,肯定逆序环视符号:(?=exp),这个正则表达式的意思就是找到a,然后向前看(右边),如果是b就匹配成功,结果就是a(因为顺序环视是不纳入结果中)。

         2.实现

            有了前面表达式基础,我需要在后面添加一个顺序环视,形成这样一个表达式(合并过后):

(?<=^[\s\S]{StarIndex,})[\s\S](?=[\s\S]{EndCount}),这里要注意了,EndCount并不是结束位置,计算公式:

EndCount=String.Length-EndIndex。字符串长度-结束位置。

    步长:

       最后终于到步长了,这是关键的一步,用于连接上面两部的,其实基础前面已经讲了,下面给出加入步长逻辑以后,形成的最后正则表达式:(?<=^[\s\S]{StarIndex,})(?<=^[\s\S]{MiddleCount})[\s\S](?=[\s\S]{EndCount}),步长参数为Step变量,这里的MiddleCount在循环中改变,每次循环都MiddleCount=MiddleCount+Step;循环到最后合并获取到的字符形成结果字符串!!。

实例演示


    最后演示一下具体匹配实例,过程,结果。

    字符串:a="abcdefghij";  a.Cut(0,3,1);

        循环次数:3-0=3次。

循环一:表达式:(?<=^[\s\S]{0,})(?<=^[\s\S]{0})[\s\S](?=[\s\S]{7})

      结果图: 
=====》‘a‘

循环二:表达式(?<=^[\s\S]{0,})(?<=^[\s\S]{1})[\s\S](?=[\s\S]{7})

     结果图:=====》‘b‘

循环三:表达式(?<=^[\s\S]{0,})(?<=^[\s\S]{2})[\s\S](?=[\s\S]{7})

     结果图:=====》‘c‘

    最终合并结果:"abc"。最后贴一张Python中的结果:.

代码展示


  


public static class StringExpander
{
/// <summary>
/// Python中的字符串切片技术,[开始索引:结束索引:步长值]
/// </summary>
/// <param name="Str">目标字符串</param>
/// <param name="StarIndex">开始索引</param>
/// <param name="EndIndex">结束索引</param>
/// <param name="Step">步长值</param>
/// <returns></returns>
public static String StringCut(this String Str, Int32 StarIndex, Int32 EndIndex, Int32 Step = 1)
{
if (EndIndex < 0)
{ EndIndex = Str.Length + EndIndex; }
if (StarIndex < 0)
{ StarIndex = Str.Length + StarIndex; }
StringBuilder sb = new StringBuilder();
Int32 LoopTime = EndIndex - StarIndex;
if (EndIndex > Str.Length) { EndIndex = Str.Length; }
Int32 EndCount = Str.Length - EndIndex;
int j = StarIndex;
for (int i = 0; i < LoopTime; i = i + Step)
{
String RegexString = @"(?<=^[\s\S]{" + StarIndex + @",})(?<=^[\s\S]{" + j + @"})[\s\S](?=[\s\S]{" + EndCount + @"})";
try
{
sb.Append(Regex.Match(Str, RegexString).Value);
}
catch { }
j = j + Step;
}
return sb.ToString();
}
/// <summary>
/// Python中的字符串切片技术,只提供位置
/// </summary>
/// <param name="Str">目标字符串</param>
/// <param name="StarIndex">位置</param>
/// <returns></returns>
public static String StringCut(this String Str, Int32 StarIndex)
{
if (StarIndex < 0)
{ StarIndex = Str.Length + StarIndex; }
return Str.Substring(StarIndex, 1);
}
}

总结


  现在提供的是字符串的实现方法,在下面可以下载Demo,里面有序列的实现方法,思想差不多,但是需要添加点东西。谢谢大家观看!

  

源码下载

时间: 2024-10-05 06:58:10

在C#中实现Python的切割技术的相关文章

iOS 开发者旅途中的指南针 - LLDB 调试技术

文章转载于:iOS 开发者旅途中的指南针 - LLDB 调试技术 今天给大家介绍的内容,无关乎任何功能性开发技术,但又对开发的效率影响至深,这就是调试技术. 何为调试呢,比如我们用 print 函数在指定位置进行输出,来定位某些节点的变量内的取值: 12345 let result = parseJSON("[1,2,3]");print(result); result = parseJSON("error");print(result);4 相信我们大家看到类似这

c#中调用python

1. 安装IronPython,到http://ironpython.codeplex.com/下载安装包 2. 创建项目 创建一个C#的控制台应用程序. 添加引用: 浏览到IronPython的安装目录中,添加对IronPython.dll,Microsoft.Scripting.dll 两个dll的引用. 3. 添加Python文件到当前的项目中 创建一个文本文件命名为:hello.py, 编辑如下 def welcome(name):    return "hello" + na

Delphi中使用python脚本读取Excel数据

Delphi中使用python脚本读取Excel数据2007-10-18 17:28:22标签:Delphi Excel python原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://seewind.blog.51cto.com/249547/46669前段时间,在正式项目中使用Python来读取Excel表格的数据.具体需求是,项目数据库中有些数据需要根据Excel表格里面的数据进行一些调整,功能应该比较简单.为了学习Pyth

现实世界中的 Python

Python 有多稳定? 非常稳定. 自 1991 年起大约每隔 6 到 18 个月就会推出新的稳定发布版,这种状态看来还将持续下去. 目前主要发布版本的间隔通常为 18 个月左右. 开发者也会推出旧版本的“问题修正”发布版,因此现有发布版的稳定性还会逐步提升. 问题修正发布版会以版本号第三部分的数字来标示(例如 3.5.3, 3.6.2),用于稳定性的管理:只有对已知问题的修正会包含在问题修正发布版中,同一系列的问题修正发布版中的接口确定将会始终保持一致. 最新的稳定版本总是可以在 Pytho

使用C语言为python编写动态模块(3)--在C中实现python中的类

楔子 这次我们来介绍python中的类型在C中是如何实现的,我们在C中创建python的int对象,可以使用PyLong_FromLong.创建python的list对象可以使用PyList_New,那么如何在C中构建一个python中的类呢? 对于构建一个类,我们肯定需要以下步骤: 创建一个类扩展 添加类的参数 添加类的方法 添加类的属性,比如可以设置.获取属性 添加类的继承 解决类的循环引用导致的内存泄露问题和自定义垃圾回收 前面几个步骤是必须的,但是容易把最后一个问题给忽略掉.我们在pyt

Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例

由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二部分将第一部分的示例进行扩展,展示了如何在python中调用多线程的C模块:第三部分扩展了第二部分,增加了在C模块的线程中回调python的演示. 本文所用的环境为:64位Win7 + python 3.4 x86 + vs2010 一.windows下的C语言多线程程序 windows下多线程编程

使用 gdb 调试运行中的 Python 进程

本文和大家分享的是使用 gdb 调试运行中的 Python 进程相关内容,一起来看看吧,希望对大家学习python有所帮助. 准备工作 安装 gdb 和 python2.7-dbg: $ sudo apt-get install gdb python2.7-dbg 设置 /proc/sys/kernel/yama/ptrace_scope: $ sudo su# echo 0 > /proc/sys/kernel/yama/ptrace_scope 运行 test.py: $ python te

【转】windows和linux中搭建python集成开发环境IDE

http://blog.csdn.net/pipisorry/article/details/39854707 使用的系统及软件Ubuntu / windowsPython 2.7 / python 3Pycharm 2.6.3Openjdk Postgresql 9.1VirtualenvVirtualenvwrapper{开始之前,可以给系统做一下备份.如误安装了Postgresql,出现了大问题就不得不把系统给重装了} 安装python 安装python 1. Ubuntu 12.04系统

在Mac OSX系统中搭建Python集成开发环境

本篇博客分享如何在Mac OSX系统中搭建Python集成开发环境 首先到Python官网下载python,python官网链接 这里选择下载Python2.7.9版本,下载完成之后安装: 安装成功,打开终端: 下面下载python开发的ide,http://www.jetbrains.com/pycharm/ 下载专业版,有30天的免费试用,足够我们学习python了. 安装,将Pycharm拖动到mac应用程序中 创建第一个Python项目: 运行python文件