设为首页 收藏本站
查看: 815|回复: 0

[经验分享] python--string--split

[复制链接]

尚未签到

发表于 2015-4-24 05:16:29 | 显示全部楼层 |阅读模式
  晚上在看《python核心编程》,看到字符串的时候。突然想到了字符串的一些神奇的地方,比如字符串是不可变类型的,字符串的切片,最最让我们熟悉的便是字符串的“+”操作了。在C#中,string相加,会产生一个新的string来存放结果。以前常常也使用“+”操作,觉得这样简单方便。但有次被老师“教育”了后,几乎就很少再这么用了。当然,python中字符串的“+”,也是这样,因为字符串是不可变类型。
  大家都知道,python是用C编写的,所以python中称的“万物皆对象”的“PyObject”就是一个结构体了,不知道我这么说,会不会被骂(害羞)。那自然地,python中的字符串,也就是“PyStringObject”了。python源码中关于“PyStringObject”的定义如下:


DSC0000.gif DSC0001.gif


typedef struct {
PyObject_VAR_HEAD
long ob_shash;
int ob_sstate;
char ob_sval[1];
/* Invariants:
*     ob_sval contains space for 'ob_size+1' elements.
*     ob_sval[ob_size] == 0.
*     ob_shash is the hash of the string or -1 if not computed yet.
*     ob_sstate != 0 iff the string object is in stringobject.c's
*       'interned' dictionary; in this case the two references
*       from 'interned' to this object are *not counted* in ob_refcnt.
*/
} PyStringObject;
PyStringObject  晕倒,我貌似跑题了!!!!!!(害羞)
  其实,晚上想做的笔记,也是由于跑题引起的。原本看源码,是打算看看字符串的切片跟“+”操作的。但是,当打开“stringobject.h”,从上往下看下去时,却在无意中看到了“string_split”方法。喔!!!my 嘎登!!!这不是我以前一直困惑的么,string的split操作!!!!一直以为split操作应该类似于这样:





///
/// 实现string.split()
///
///
///
///
public List Split(string strMain, char c)
{
var list = new List();
var strBuilder = new StringBuilder();
foreach (var item in strMain)
{
if (item != c)
{
strBuilder.Append(item);
}
else
{
list.Add(strBuilder.ToString());
strBuilder = new StringBuilder();
}
}
if (!string.IsNullOrEmpty(strBuilder.ToString()))
{
list.Add(strBuilder.ToString());
}
return list;
}
///
///Split 的测试
///
        [TestMethod()]
public void SplitTest()
{
MyString target = new MyString(); // TODO: 初始化为适当的值
string strMain ="Hello World!"; // TODO: 初始化为适当的值
char c = ' '; // TODO: 初始化为适当的值
List expected = new List() { "Hello","World!"}; // TODO: 初始化为适当的值
List actual;
actual = target.Split(strMain, c);
CollectionAssert.AreEqual(expected, actual);
}
Split  于是,我便把原来需要寻找的某个目标,给抛到了脑后(对不起!!!)。专心的看起来split的操作,以了多年来的心愿。废话不多说,先上代码!!!





PyDoc_STRVAR(split__doc__,
"S.split([sep [,maxsplit]]) -> list of strings\n\
\n\
Return a list of the words in the string S, using sep as the\n\
delimiter string.  If maxsplit is given, at most maxsplit\n\
splits are done. If sep is not specified or is None, any\n\
whitespace string is a separator and empty strings are removed\n\
from the result.");
static PyObject *
string_split(PyStringObject *self, PyObject *args)
{
Py_ssize_t len = PyString_GET_SIZE(self), n;
Py_ssize_t maxsplit = -1;
const char *s = PyString_AS_STRING(self), *sub;
PyObject *subobj = Py_None;
if (!PyArg_ParseTuple(args, "|On:split", &subobj, &maxsplit))
return NULL;
if (maxsplit < 0)
maxsplit = PY_SSIZE_T_MAX;
if (subobj == Py_None)
return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit);
if (PyString_Check(subobj)) {
sub = PyString_AS_STRING(subobj);
n = PyString_GET_SIZE(subobj);
}
#ifdef Py_USING_UNICODE
else if (PyUnicode_Check(subobj))
return PyUnicode_Split((PyObject *)self, subobj, maxsplit);
#endif
else if (PyObject_AsCharBuffer(subobj, &sub, &n))
return NULL;
return stringlib_split((PyObject*) self, s, len, sub, n, maxsplit);
}
string_split  看了“PyDoc_STRVAR”,明知道这个就是python中“help”关于“split”的介绍,我还是很贱的验证了下(我都想抽自己)。我真贱!!!
  继续看代码,当看到“PyArg_ParseTuple(args, "|On:split", &subobj, &maxsplit)”的时候,又二了,这个函数是啥意思?由于用的是VS看的源码,所以本能的、很贱的直接F12了。(由于现在主语言还是C#,所以感觉VS用的熟,也就用来看python源码了)一直F12,越F12,感觉自己越二(因为看不懂啊!!!!!)索性,直接网上百度google之。想不到,还真有!!!!哎!!!感谢牛人们啊!!!!直接上介绍!!!
  The PyArg_ParseTuple() function is declared as follows:


int PyArg_ParseTuple(PyObject *arg, char *format, ...);

  The arg argument must be a tuple object containing an argument list passed from Python to a C function. The format argument must be a format string, whose syntax is explained below. The remaining arguments must be addresses of variables whose type is determined by the format string. For the conversion to succeed, the arg object must match the format and the format must be exhausted.
  想了解具体的,请猛戳这里:http://www.iyunv.com/DxSoft/archive/2011/04/01/2002676.html
  由于本人英语实在不咋地,虽然自己看得懂,但实在是不敢翻译,怕误导了大家。还是看英文吧!!!
  然后又是一阵F12,终于到了“stringlib_split((PyObject*) self, s, len, sub, n, maxsplit)”,然后又是一阵猛戳F12,





Py_LOCAL_INLINE(PyObject *)
stringlib_split(PyObject* str_obj,
const STRINGLIB_CHAR* str, Py_ssize_t str_len,
const STRINGLIB_CHAR* sep, Py_ssize_t sep_len,
Py_ssize_t maxcount)
{
Py_ssize_t i, j, pos, count=0;
PyObject *list, *sub;
if (sep_len == 0) {
PyErr_SetString(PyExc_ValueError, "empty separator");
return NULL;
}
else if (sep_len == 1)
return stringlib_split_char(str_obj, str, str_len, sep[0], maxcount);
list = PyList_New(PREALLOC_SIZE(maxcount));
if (list == NULL)
return NULL;
i = j = 0;
while (maxcount-- > 0) {
pos = fastsearch(str+i, str_len-i, sep, sep_len, -1, FAST_SEARCH);
if (pos < 0)
break;
j = i + pos;
SPLIT_ADD(str, i, j);
i = j + sep_len;
}
#ifndef STRINGLIB_MUTABLE
if (count == 0 && STRINGLIB_CHECK_EXACT(str_obj)) {
/* No match in str_obj, so just use it as list[0] */
Py_INCREF(str_obj);
PyList_SET_ITEM(list, 0, (PyObject *)str_obj);
count++;
} else
#endif
{
SPLIT_ADD(str, i, str_len);
}
FIX_PREALLOC_SIZE(list);
return list;
onError:
Py_DECREF(list);
return NULL;
}
stringlib_split


#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item = (v))
  哈哈!大家都看到了吧,最后,字符串转换成了list,然后再替换,所以才会有介绍中的“list of strings”。
  由于不敢误人子弟,而且自己的理解也不是很到位,所以就只能做一名忠诚的拷贝党了!!!! 当然,这主要还是写给自己看,我想看得人基本上也不多,所以也就无所谓了。为了省篇幅,还受日常编码的影响,所以代码喜欢收起来。若有哪位,不小心赏光看本文的话,给您造成的不便,小的我在此三拜道歉了!!!!
  由于各种跑题,所以原目标还是没完成,留在明天再做笔记吧。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60003-1-1.html 上篇帖子: Python PIL Image模块中有Open方法却没有Close方法!? 下篇帖子: 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表