一句python,一句R︱python中的字符串操作、中文乱码、NaN情况

先学了R,最近刚刚上手Python,所以想着将python和R结合起来互相对比来更好理解python。最好就是一句python,对应写一句R。

pandas可谓如雷贯耳,数据处理神器。

以下符号:

=R=

代表着在R中代码是怎么样的。

————————————————————————————————————————————

字符编码

encode 和 decode

Python2 默认的编码是 ascii,通过 encode 可以将对象的编码转换为指定编码格式(称作“编码”),而 decode
是这个过程的逆过程(称作“解码”)。

decode,将字节串转变为字符串,并且这个字符串是按照 unicode 编码的。在 unicode
编码中,一个汉字对应一个字符,这时候度量它的长度就是 1.

encode,一个 unicode 编码的字符串,也可以转换为字节串。

[html] view plain copy

print?



   
>>> a = "中"
 

   
>>> a
 

   
'\xe4\xb8\xad'  

    
 

   
>>> b = a.decode()
 

   
>>> b
 

    u'\u4e2d'
 



其中,a就是ASCII格式的编码,字节串;b就是unicode编码的字符串。当然有一个问题就是最后出来的还不是汉字。。。(醉!)

————————————————————————————————————————————

一、字符形成、展示、拼接、切片

1、字符形成=R=paste

双引号包裹单引号

[html] view plain copy

print?



   
>>> "What's your
name?"  

    "What's your
name?" 

单引号使用转义符



[html] view plain copy

print?



   
>>> 'What\'s your
name?'  

    "What's your
name?" 

2、字符串展示print /raw_input

[html] view plain copy

print?



   
>>> name =
raw_input("input your name:")  

    input your
name:python  

   
>>> name
 

    'python'
 



其中raw_input有点交互关系,具体看案例,直接键入name就可以获得你输入的内容。

[html] view plain copy

print?



   
>>> print("hello,
world")  

    hello,
world 

3、字符切片、选择、截取 =R=无

字符可以像一般的数据格式一样进行切片选择,有点像series:



[html] view plain copy

print?



   
>>> lang = "study
Python"  

   
>>> lang[0]
 

    's'
 

   
>>> lang[2:9]
 

    'udy pyt'
 



当然也包括lang[:]可以选中所有的。

其中index代表着某个字符的索引值。

[html] view plain copy

print?



   
lang.index("p") 

4、内存编号 =R= 无

这个与R中不一样,当数据存入python之后,机器会自动给存入内存的数据编号,这个编号可以用id来查看。

[html] view plain copy

print?



   
>>> id(c)
 

    3071934536L
 

   
>>> id(lang)
 

   
3071934536L 

5、ASCII 值(是十进制的)

ord("a")   代表输入字符返回ASCII值



cha(97)  代表输入ASCII值返回字符



[html] view plain copy

print?



   
>>>
cmp("a","b")   
#a-->97, b-->98, 97 小于 98,所以 a 小于 b
 

    -1
 



其中cmp()代表比较 a  b 两个字符的ASCII值的大小,返回值为1,0,-1



[html] view plain copy

print?



   
>>> max(str1)
 

    'd'
 

   
>>> max(str2)
 

    'e'
 

   
>>> min(str1)
 

    'a'
 



返回字符的ASCII值的最大值。

————————————————————————————————————————————

二、字符串基本操作

1、字符串重复 =R=rep



[html] view plain copy

print?



   
>>> str1*3
 

   
'abcdabcdabcd' 

其中变成字符串有两种方式:一种是str()或者是用单引号来表示。

2、字符串拼接

(1) 号 =R= paste



[html] view plain copy

print?



   
>>> "Py" "thon"
 

    'Python'
 

    
 

   
>>> a = 1989
 

   
>>> b = "free"
 

    
 

   
>>> print b “a”
 

   
>>> print b
str(a) 

其中变成字符串有两种方式:一种是str()或者是用单引号来表示。

乘法,就是重复那个字符串的含义。

(2)join =R= paste



用 .  来填补间隔中的内容。





3、语句分割split =R= split



这个函数的作用是将字符串根据某个分割符进行分割。



[html] view plain copy

print?



   
>>> a = "I LOVE
PYTHON"  

   
>>> a.split(" ")
 

    ['I',
'LOVE', 'PYTHON']  



其中split(“ ”)括号中,代表着依据什么样式来进行分割。

4、字符串去掉空格 = R=grep



方法是:



    S.strip()
去掉字符串的左右空格

    S.lstrip()
去掉字符串的左边空格

    S.rstrip()
去掉字符串的右边空格



[html] view plain copy

print?



   
>>> b=" hello
"    # 两边有空格
 

   
>>> b.strip()
 

   
'hello' 

5、字符串大小写

在 Python 中有下面一堆内建函数,用来实现各种类型的大小写转化



    S.upper() #S
中的字母大写

    S.lower() #S
中的字母小写

   
S.capitalize() # 首字母大写

    S.isupper()
#S 中的字母是否全是大写

    S.islower()
#S 中的字母是否全是小写

   
S.istitle()



S.title()  #把所有的单词的第一个字母转化为大写



S.istitle()  #判断每个单词的第一个字母是否为大写

6、in 包含关系 =R=%in%

类似集合计算,a in b代表a是否包含在b中,返回的是布尔值。



[html] view plain copy

print?



   
>>> "a" in str1
 

    True
 

   
>>> "de" in str1
 

    False
 

   
>>> "de" in str2
 

   
True 

7、字符长度len  =R= length



[html] view plain copy

print?



   
>>> a="hello"
 

   
>>> len(a)
 

   


————————————————————————————————————————————

三、转义符、占用符列表

1、转义符列表



在字符串中,有时需要输入一些特殊的符号,但是,某些符号不能直接输出,就需要用转义符。所谓转义,就是不采用符号本来的含义,而采用另外一含义了。下面表格中列出常用的转义符:

转义字符    描述

\    (在行尾时)
续行符

\    反斜杠符号

\'    单引号

\"    双引号

\a    响铃

\b  
 退格(Backspace)

\e    转义

\000    空

\n    换行

\v  
 纵向制表符

\t  
 横向制表符

\r    回车

\f    换页

\oyy    八进制数,yy
代表的字符,例如:\o12 代表换行

\xyy    十六进制数,yy
代表的字符,例如:\x0a 代表换行

\other  
 其它的字符以普通格式输出



以上所有转义符,都可以通过交互模式下 print 来测试一下,感受实际上是什么样子的。



2、占位符



占位符在自动生成字符内容方面有很好的应用:



[html] view plain copy

print?



   
>>> print "我%s喜欢NLP" %
"非常"  

   
我非常喜欢NLP 

(1)老式占位符%s



另外,不同的占位符,会表示那个位置应该被不同类型的对象填充。下面列出许多,供参考。不过,不用记忆,常用的只有 %s 和
%d,或者再加上 %f,其它的如果需要了,到这里来查即可。



(2)新式{}

[html] view plain copy

print?



   
>>> print "我{}喜欢NLP"
.format("非常")  

   
我非常喜欢NLP 

 Python 非常提倡的 string.format()的格式化方法,其中 {}
作为占位符。



这种方法真的是非常好,而且非常简单,只需要将对应的东西,按照顺序在 format 后面的括号中排列好,分别对应占位符 {}
即可。我喜欢的方法。

四、Python 中如何避免中文是乱码



这个问题是一个具有很强操作性的问题。我这里有一个经验总结,分享一下,供参考:



首先,提倡使用 utf-8 编码方案,因为它跨平台不错。



经验一:在开头声明:



# -*- coding: utf-8 -*-



有朋友问我-*-有什么作用,那个就是为了好看,爱美之心人皆有,更何况程序员?当然,也可以写成:



# coding:utf-8



经验二:遇到字符(节)串,立刻转化为 unicode,不要用 str(),直接使用 unicode()



unicode_str = unicode('中文', encoding='utf-8')

print unicode_str.encode('utf-8')



经验三:如果对文件操作,打开文件的时候,最好用 codecs.open,替代 open(这个后面会讲到,先放在这里)



import codecs

codecs.open('filename', encoding='utf8')

五、Python正则表达式:re的match方法(来源公众号人人可以学python)



Python 从1.5版本起添加了模块re ,提供 Perl 风格的正则表达式模式



我们经常用的有re.match( ), re.search( ),re.sub( ), 下面我们一个一个来讲一下。



其中注意它们各自的区别



re.match( )



    match(
)从要匹配的字符串的起始位置开始匹配一个正则表达式。如果起始位置匹配失败,则返回None



re.match(pattern, string, flags=0)



参数:



pattern: 正则表达式



string:要匹配的字符串



flags:标志位,用来控制匹配模式





    [html] view
plain copy

    print?

       
举例:  

       
#!/usr/bin/python  

       
# -*- coding: UTF-8 -*-   

       
import re  

       
str1 = "Allen is renren python"  

       
print re.match('Bllen', str1)  

       
print re.match('Allen', str1)  

       
print re.match('.*renren.*', str1)  

       
allenwoo@~/renren$ python
test.py  

第一个由于一开始匹配不成功,所以结果是None

第二个在字符串开始就找到了“Allen”所以匹配成功,返回结果

第三个," . "表示任何字符,“ * ”表示前面一个修饰符有任何个(包括0个)

所以" .* "就是匹配任何个数的任何字符的意思。

[html] view plain copy

print?



   
#!/usr/bin/python  

    # -*-
coding: UTF-8 -*-   

    import re
 

    str1 =
"Allen is renren python"  

    r =
re.match('Allen', str1)  

    #
span是返回我们匹配到的字符串的开始和结束的下标  

    print
r.span()  

    #
group返回我们匹配到的字符串  

    print
r.group()  

    print "\n"
 

    r =
re.match('.*renren.*', str1)  

    print
r.span()  

    print
r.group()  



   
数字匹配可以使用\w或者[0-9]



比如要匹配字符串"Jack age:18,sex:m"中的数字

[html] view plain copy

 print?



   
#!/usr/bin/python  

    # -*-
coding: UTF-8 -*-   

    import re
 

    str1 = "Jack
age:18,sex:m"  

    r =
re.match('.*\w .*', str1)  

    if r:
 

       
print r.group()  

    print "\n"
 

     
 

    r =
re.match('.*[0-9] .*', str1)  

    if r:
 

       
print r.group()  

     
 

   
print("分组匹配输出")  

    r =
re.match(r'(.*):([0-9] ).*', str1)  

    if r:
 

       
print r.group()  

       
print r.group(1)  

       
print r.group(2) 

你会发现我们在正则表达式中使用()就能分组匹配,然后可以使用group返回每个括号中匹配的字符串。



注意: 在re.match(r'(.*):([0-9] ).*', str1)的表达式前面我们使用了一个 r,
r是防止字符串转意,因为我们使用了(),我们不希望它被当作要匹配的字符。



   
附:那这就先讲一下转意:



[html] view plain copy

print?



   
#!/usr/bin/python  

    # -*-
coding: UTF-8 -*-   

    #
大家都知道\n是换行符,  

    # 而\t
是tab空格,相当于我们键盘的tab键  

   
print("We\tare\trenrenpython")  

     
 

    # 加上r防止转意后
 

   
print(r"We\tare\trenrenpython") 



 \是一个特殊符符号,用来转意一些字符,如\n换行符



使用了 r 后"\t"就是字符串"\t", 而不是tab

   
然后又有新的问题来了,想"\w"," . ", " *
"都被用作了正则表达式的修饰符,如果我们需要把它们当原本的字符匹配怎么办呢?使用" \"

[html] view plain copy

print?



   
#!/usr/bin/python  

    # -*-
coding: UTF-8 -*-   

    import re
 

    str1 =
"python . renren"  

    str2 =
"python : renren"  

    # 由于"."
是代表任何字符,所以下面表达式str1,str2都能匹配到  

    r =
re.match('.* . .*', str1)  

    if r:
 

       
print r.group()  

    else:
 

       
print "未匹配"   

     
 

    r =
re.match('.* . .*', str2)  

    if r:
 

       
print r.group()  

    else:
 

       
print "未匹配"   

    print "\n"
 

     
 

    #
如果我们要匹配的是"."这个字符呢?   

    r =
re.match('.* \. .*', str1)  

    if r:
 

       
print r.group()  

    else:
 

       
print "未匹配"   

     
 

    r =
re.match('.* \. .*', str2)  

    if r:
 

       
print r.group()  

    else:
 

       
print "未匹配" 

延伸一:Nan

[python] view plain copy

print?



    def
isnotNaN(num):  

       
return num == num

最新文章

  1. SFC的OAM管理框架
  2. truncate和delete之间有什么区别
  3. 拖放 js
  4. CSS笔记(四)文本
  5. android 拨打电话小功能
  6. Samba服务详解
  7. Android 4.4 上实现透明导航栏和状态栏 Translucent system bar
  8. UVA 12219 Common Subexpression Elimination
  9. POJ 2175 spfa费用流消圈
  10. Java double和 float丢失精度问题
  11. 海量数据挖掘MMDS week4: 推荐系统之数据降维Dimensionality Reduction
  12. 吴恩达机器学习笔记26-样本和直观理解1(Examples and Intuitions I)
  13. [LeetCode&Python] Problem 653. Two Sum IV - Input is a BST
  14. thinkphp3.2集成QRcode生成二维码
  15. django 接口编写的配置
  16. 时间模块 --- time
  17. ValueError: Invalid leaf XXX
  18. love2d教程32--碎图打包器texturepacker
  19. 错误 10 非静态的字段、方法或属性“Test10.Program.a”要求对象引用
  20. 常见前端UI框架

热门文章

  1. 原生js封装ajax代码
  2. HZOI20190906模拟38 金,斯诺,赤
  3. 分享非常漂亮的WPF界面框架源码及插件化实现原理
  4. 常用 docker 容器 使用
  5. 渗透神器----BurpSuite_pro_v2.1
  6. day2(老男孩-Python3.5-S14期全栈开发)
  7. 提高scrapy的抓取效率
  8. Hadoop 集群网络拓扑
  9. Vertex Covers(高维前缀和)
  10. CentOS 6.5安装libvirt启动不了libvirtd进程的错误