在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 = )
{
if (EndIndex < )
{ EndIndex = Str.Length + EndIndex; }
if (StarIndex < )
{ 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 = ; 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 < )
{ StarIndex = Str.Length + StarIndex; }
return Str.Substring(StarIndex, );
}
}

总结

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

  

源码下载

在C#中实现Python的分片技术的更多相关文章

  1. 3.Python编程语言基础技术框架

    3.Python编程语言基础技术框架 3.1查看数据项数据类型 type(name) 3.2查看数据项数据id id(name) 3.3对象引用 备注Python将所有数据存为内存对象 Python中 ...

  2. 8天学通MongoDB——第六天 分片技术

    在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存 就吃不消了,针对这样的场景我们该如何应对. 一:分片 mong ...

  3. MongoDB分片技术[转]

    8天学通MongoDB——第六天 分片技术   在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存 就吃不消了,针 ...

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

    Delphi中使用python脚本读取Excel数据2007-10-18 17:28:22标签:Delphi Excel python原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...

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

    文章转载于:iOS 开发者旅途中的指南针 - LLDB 调试技术 今天给大家介绍的内容,无关乎任何功能性开发技术,但又对开发的效率影响至深,这就是调试技术. 何为调试呢,比如我们用 print 函数在 ...

  6. [译]如何在Web开发中使用Python

    [译]如何在Web开发中使用Python 原文:HOWTO Use Python in the Web 摘要 这篇文档展示了Python如何融入到web中.它介绍了几种Python结合web服务器的方 ...

  7. MP4大文件虚拟HLS分片技术,避免服务器大量文件碎片

    MP4大文件虚拟HLS分片技术,避免点播服务器的文件碎片 本文主要介绍了通过虚拟分片技术,把MP4文件,映射为HLS协议中的一个个小的TS分片文件,实现了在不实际切分MP4文件的情况下,通过HLS协议 ...

  8. 在Java中调用Python

    写在前面 在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢.当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单.恰好我在项目中就遇到了这个问题 ...

  9. 在VS Code中对Python进行单元测试

    在VS Code中对Python进行单元测试 Python扩展支持使用Python的内置unittest框架以及pytest和Nose进行单元测试.要使用pytest和Nose,必须将它们安装到当前的 ...

随机推荐

  1. How to begin Python learning?

    如何开始Python语言学习? 1. 先了解它,Wiki百科:http://zh.wikipedia.org/zh-cn/Python 2. Python, Ruby等语言来自开源社区,社区的学法是V ...

  2. mysql 配置主从

    1.选择2个ip,1个为主,1个为从:例:主:192.168.12.76 从:192.168.12.772.在192.168.12.76的my.cnf 配置master,添加如下:(红色为添加的内容) ...

  3. VirtualBox虚拟机安装MSDOS和MINIX2.0.0双系统

    1. 在VirtualBox中新建一个MSDOS虚拟机. 2.下载一个MSDOS软盘镜像. 3.启动虚拟机,提示选择安装盘时,选择步骤2下载过来的MSDOS镜像. 4.正常启动进入DOS命令行,用FD ...

  4. ios里的UIActionSheet的使用

    class ViewController: UIViewController,UIActionSheetDelegate{ @IBOutlet weak var label1: UILabel! @I ...

  5. C#的winform拼数字游戏

    C#的winform拼数字游戏 声明:阅读了别人的代码学习修改而来,增加了美观度和游戏乐趣.(作者出处忘了不好意思) 程序截图 关键代码 using System; using System.Coll ...

  6. iOS常见问题(3)

    一.发现不少人在给成员变量初始化的时候,容易进错一个方法去初始化. //注意这个方法只有在内存发生警告的时候才会调用. - (void)didReceiveMemoryWarning { [super ...

  7. div+css登陆界面案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. LintCode-Median II

    Numbers keep coming, return the median of numbers at every time a new number added. Example For numb ...

  9. 屏蔽ios7中某个页面的默认手势滑回返回

    - (void)viewWillDisappear:(BOOL)animated {[super viewWillDisappear:YES];self.navigationController.in ...

  10. hadoop 数据采样

    http://www.cnblogs.com/xuxm2007/archive/2012/03/04/2379143.html 原文地址如上: 关于Hadoop中的采样器 .为什么要使用采样器 在这个 ...