用Python作文本处理 第二章 -- 基本的字符串运用

用Python作文本处理 第二章 -- 基本的字符串运用
用Python作文本处理 第二章 -- 基本的字符串运用

用Python作文本处理/第二章

目录

?1第一节-- 常用的操作

?2主题-- 快速排序

?3主题-- 排版

?4主题-- 处理字段

?5主题-- 字词数统计

?6主题-- 以二进制数据传送ASCII码信息

?7主题-- 词频统计

第一节-- 常用的操作

主题-- 快速排序

排序是文字处理中大多数任务的关键所在。幸运的是,在Python里,使用`[].sort`的效率还不错。此外,在列表的任何不同对象都可以排序而不需要像C语言那样需要统一的元素(对于混合复数和Unicode字符串的列表排序在最近的几个Python版本里会触发'TypeError'异常)。

参考:[complex]

+++

列表排序的顺序有一种自然顺序,特别是不同类型混合的排序顺序都是Python的默认顺序。很多时候,你需要特定的顺序。特别是对于文本里的行做排序往往需要的不是简单的字母顺序。通常一行里有用的信息起始位置并不是第一个字符:人名里的姓往往是第二个单词;服务器日志里IP地址可能固定在某个字段;金额合计可能在每一行的第

70列等等。只使用默认排序这些内容只会毫无意义。

列表排序`[].sort()`支持自定义比较函数参数。这个比较函数的功能是返回-1则表示前者排在后者之前,返回0则表示二者顺序相同,返回1则表示后者排在前者之前。内置函数`cmp()`就是`[].sort()`的默认比较函数(在速度上'lst.sort()'远远超过'lst.sort(cmp)')。

对于不太长的列表使用自定义比较函数可以快速的解决问题。在很多情况下,甚至可以直接使用一个'lambda'表达式来完成任务。

说到速度,使用自定义比较函数效率会很低。部分原因是Python的函数调用开销,函数本身也会增加花费的时间。不过有一种技术“Schwartzian转换”可以加速这种自定义排序。Schwartzian转换是兰德尔施瓦兹在Perl中最先开始使用的,但其中的技巧同样适用于Python。

使用Schwartzian转换主要包括三个步骤,(准确的来说这是Guttman-Rosler转换

(GRT),同样基于Schwartzian转换):

? 1. 将列表转换为可以用默认排序的列表。

? 2. 使用`[].sort()`排序。

? 3. 转回原先的格式。

这项技术的主要作用是花费仅仅O(2N)转换就可以使用默认的O(N log N)排序。如果

任务里排序时间是主要因素的话,使用这项技术将大大提高效率(唯一的限制就是转换花费的时间不会很多)。

下面是一个简单的例子。排序比较方式是比较每一行的第四个单词。有的行单词数少于4个。测试文件约20,000行(1兆左右)使用Schwartzian转换排序花费不到2秒,而使用自定义比较函数则花费12秒以上(排序结果一样)。确切时间不会很准确,但很明显效率提高了6倍。

#---------- schwartzian_sort.py ----------#

#- 测试按第四个单词排序的速度

#- 如果两行都有4个以上单词,则按照第4个第5个。。来排序

#- 没有4个单词的行排在有4个单词的行后面

#- 没有4个单词的行之间按照默认顺序排列

import sys, string, time

wrerr = sys.stderr.write

#- 自定义比较函数

def fourth_word(ln1,ln2):

lst1 = string.split(ln1)

lst2 = string.split(ln2)

#-- 比较4个单词以上的行

if len(lst1) >= 4 and len(lst2) >= 4:

return cmp(lst1[3:],lst2[3:])

#-- 少于4个单词的行排在后面

elif len(lst1) >= 4 and len(lst2) < 4:

return -1

#-- 少于4个单词的行排在后面

elif len(lst1) < 4 and len(lst2) >= 4:

return 1

else: # 默认顺序

return cmp(ln1,ln2)

#- 不计算读取时间

lines = open(sys.argv[1]).readlines()

#- 计时使用自定义比较函数排序

start = time.time()

lines.sort(fourth_word)

end = time.time()

wrerr("Custom comparison func in %3.2f secs\n" % (end-start))

# open('tmp.custom','w').writelines(lines)

#- 不计算读取时间

lines = open(sys.argv[1]).readlines()

#- 计时Schwartzian转换排序

start = time.time()

for n in range(len(lines)): # 开始转换

lst = string.split(lines[n])

if len(lst) >= 4: # 把排序内容放在前面

lines[n] = (lst[3:], lines[n])

else: # 少于4个单词的行排在后面

lines[n] = (['\377'], lines[n])

lines.sort() # 排序

for n in range(len(lines)): # 转换回原先内容

lines[n] = lines[n][1]

end = time.time()

wrerr("Schwartzian transform sort in %3.2f secs\n" % (end-start))

# open('tmp.schwartzian','w').writelines(lines)

这只有一个特别的例子,但读者应该能够用任何形式来使用这种技术,特别是对于大文件。

主题-- 排版

虽然使用ASCII文本作为通讯格式并不好--通常不会很复杂文件不会很大--但其生命力

还是很强的。README文件,HOWTO文件,电子邮件,新闻组,包括本书都仍然是

使用ASCII码文本(至少原文加工技术通常是很有价值的)。此外,许多像HTML和

Latex的格式往往也需要手动修改,清晰的排版是非常重要的。

段落排版对于文本文件来说是极为常见的工作。Python2.3增加了[textwrap]模块做一些有限的排版工作。在大多数情况下,这项工作可以使用文本编辑器来完成。不过,有时候自动化排版会更方便。这项工作很简单,比较奇怪的是,Python没有相应的标准

模块功能实现这一点。有一个`formatter.DumbWriter`类和

`formatter.AbstractWriter`抽象类可以用于此项工作。相关讨论在第5章,坦率地说,使用这些类需要大量的定制工作而且很复杂,往往不适合用于解决手头的任务。

下面是一种简单的解决办法,可以当作命令行工具(从标准输入读取和输出到标准输

出),或用于较大的应用程序。

#---------- reformat_para.py ----------#

# 简单排版。主要用于左右对齐。

LEFT,RIGHT,CENTER = 'LEFT','RIGHT','CENTER'

def reformat_para(para=,left=0,right=72,just=LEFT):

words = para.split()

lines = []

line =

word = 0

end_words = 0

while not end_words:

if len(words[word]) > right-left: # 过长的单词

line = words[word]

word +=1

if word >= len(words):

end_words = 1

else: # 收集一行可以容纳的单词

while len(line)+len(words[word]) <= right-left:

line += words[word]+' '

word += 1

if word >= len(words):

end_words = 1

break

lines.append(line)

line =

if just==CENTER:

r, l = right, left

return '\n'.join([' '*left+ln.center(r-l) for ln in lines])

elif just==RIGHT:

return '\n'.join([line.rjust(right) for line in lines])

else: # left justify

return '\n'.join([' '*left+line for line in lines])

if __name__=='__main__':

import sys

if len(sys.argv) <> 4:

print "Please specify left_margin, right_marg, justification"

else:

left = int(sys.argv[1])

right = int(sys.argv[2])

just = sys.argv[3].upper()

# 排版每一段

for p in sys.stdin.read().split('\n\n'):

print reformat_para(p,left,right,just),'\n'

留给读者一些改进任务。例如您可能需要首行缩进。或者有些段落需要的格式不适合用此排版(例如题头等等)。具体的应用程序还可能需要确定如何分段等等。

主题-- 处理字段

数据表,DBMS,日志文件以及平面数据库往往在每行放置同样的纪录,每条记录有相同的字段。通常这些字段要么是用分割符间隔要么是用固定位置来存放。

分析这些记录的结构很容易,进行表格计算上也同样很简单。对于各种文本结构数据,可以使用几乎相同的代码来做处理。

下面的例子中提供了一种通用的框架来处理结构化文本。

#---------- fields_stats.py ----------#

# 处理文本数据库里的多个字段

import operator

from types import *

from xreadlines import xreadlines # 需要Python2.1,提高效率

# 2.1以下使用.readline()

#-- 格式常量

DELIMITED = 1

FLATFILE = 2

#-- 一些简单的处理过程(使用函数式风格)

nillFunc = lambda lst: None

toFloat = lambda lst: map(float, lst)

avg_lst = lambda lst: reduce(operator.add, toFloat(lst))/len(lst)

sum_lst = lambda lst: reduce(operator.add, toFloat(lst))

max_lst = lambda lst: reduce(max, toFloat(lst))

class FieldStats:

"""统计资料

text_db 可以是字符串(包括Unicode字符串)或文件类对象

style 有2种格式(DELIMITED, FLATFILE)分隔符或位置

默认使用分隔符格式

column_positions 位置列表,第一列的位置为1。

例如:(1,7,40) 表示3个字段,起始位置分别为1,7,40 field_funcs 是字典,储存需要处理的字段和对应处理过程。

例如:{1:avg_lst, 4:sum_lst, 5:max_lst}

表示对第一个字段做求平均值处理

对第四个字段做合计处理,对第5个字段求最大值

其他字段不做处理。

"""

def __init__(self,

text_db=,

style=DELIMITED,

delimiter=',',

column_positions=(1,),

field_funcs={} ):

self.text_db = text_db

self.style = style

self.delimiter = delimiter

self.column_positions = column_positions

self.field_funcs = field_funcs

def calc(self):

"""计算"""

#-- 第一步先建立列表的列表来存放数据。

used_cols = self.field_funcs.keys()

used_cols.sort()

# : 不使用column[0]

columns = []

for n in range(1+used_cols[-1]):

# 提示: 这里可以使用'[[]]*num'来代替

columns.append([])

#-- 第二步生成需要计算的列表数据

# text_db是字符串对象

if type(self.text_db) in (StringType,UnicodeType):

for line in self.text_db.split('\n'):

fields = self.splitter(line)

for col in used_cols:

field = fields[col-1] # 注意这里是由0开始的索引

columns[col].append(field)

else: # text_db是文件对象

for line in xreadlines(self.text_db):

fields = self.splitter(line)

for col in used_cols:

field = fields[col-1] # 注意这里是由0开始的索引

columns[col].append(field)

#-- 第三步作处理计算

results = [None] * (1+used_cols[-1])

for col in used_cols:

results[col] = \

apply(self.field_funcs[col],(columns[col],))

#-- Finally, return the result list

return results

def splitter(self, line):

"""分解一行为字段表"""

if self.style == DELIMITED:

return line.split(self.delimiter)

elif self.style == FLATFILE:

fields = []

# 注意这里是以0开始的索引

# 最后加上结束位置

num_positions = len(self.column_positions)

offsets = [(pos-1) for pos in self.column_positions]

offsets.append(len(line))

for pos in range(num_positions):

start = offsets[pos]

end = offsets[pos+1]

fields.append(line[start:end])

return fields

else:

raise ValueError, \

"Text database must be DELIMITED or FLATFILE"

#-- 测试数据

# First Name, Last Name, Salary, Years Seniority, Department

delim =

Kevin,Smith,50000,5,Media Relations

Tom,Woo,30000,7,Accounting

Sally,Jones,62000,10,Management

.strip() # no leading/trailing newlines

# Comment First Last Salary Years Dept

flat =

tech note Kevin Smith 50000 5 Media Relations more filler Tom Woo 30000 7 Accounting yet more... Sally Jones 62000 10 Management

.strip() # no leading/trailing newlines

#-- Run self-test code

if __name__ == '__main__':

getdelim = FieldStats(delim, field_funcs={3:avg_lst,4:max_lst})

print 'Delimited Calculations:'

results = getdelim.calc()

print ' Average salary -', results[3]

print ' Max years worked -', results[4]

getflat = FieldStats(flat, field_funcs={3:avg_lst,4:max_lst},

style=FLATFILE,

column_positions=(15,25,35,45,52))

print 'Flat Calculations:'

results = getflat.calc()

print ' Average salary -', results[3]

print ' Max years worked -', results[4]

上面的例子中包括了一些效率上的考虑,可以用于大型数据集。首先,'FieldStats'类是动态处理文本,而没有保存整个数据。`xreadlines.xreadlines()`是一个极其快速和有效的行阅读器,但它需要Python2.1+,其他版本可以使用`FILE.readline()`或

`FILE.readlines()`。此外,只关心实际上需要用到的数据,以便节省内存。这里没有考虑同时使用多个相关字段做处理的应用,不过可以提取出数据作再次运算。

还有就是没有考虑在同一个字段上作多种处理,这个留给读者作思考。

主题-- 字词数统计

Unix系统下有个工具'wc'可以做这个任务。这是个基本工具不能统计段落。'wc'只能统计字符,单词和行。有几个命令选项可以控制显示的结果,不过我很少用到它们。

在写这一段的时候,我发现自己的系统里没有装'wc'。下面的例子实际上是一个增强版'wc',不过缺少了很多命令行选项。在Python里可以非常简单的实现'wc'的功能。其主要使用的技术是`"".join()`和`"".split()`。

#---------- wc.py ----------#

# 统计字符数,单词数,行数和段落数

# 可以STDIN输入或使用文件通配符

import sys, glob

if len(sys.argv) > 1:

c, w, l, p = 0, 0, 0, 0

for pat in sys.argv[1:]:

for file in glob.glob(pat):

s = open(file).read()

wc = len(s), len(s.split()), \

len(s.split('\n')), len(s.split('\n\n'))

print '\t'.join(map(str, wc)),'\t'+file

c, w, l, p = c+wc[0], w+wc[1], l+wc[2], p+wc[3]

wc = (c,w,l,p)

print '\t'.join(map(str, wc)), '\tTOTAL'

else:

s = sys.stdin.read()

wc = len(s), len(s.split()), len(s.split('\n')), \

len(s.split('\n\n'))

print '\t'.join(map(str, wc)), '\tSTDIN'

这个小功能可以在一个函数里实现,不过它太过于紧凑。不过在使用解释器的环境下者只需要两行。

上面的解决方法符合Python的准则,用一种显而易见的方式来完成任务。还有个方法也可以完成同样的任务,读者可以思考一下(这只是好玩):

>>> wc = map(len,[s]+map(s.split,(None,'\n','\n\n')))

如果再加上'print'语句,就可以用一行来解决问题了。

主题-- 以二进制数据传送ASCII码信息

许多文本信息都是采用7位ASCII编码。特别是用在互联网传送的时候非ASCII码的信息需要先编成7位ASCII码才能正常传送,否则会因为最高位被分解导致出现乱码。像简单邮件传输协议(SMTP),网络新闻传输协议(NNTP)或HTTP的内容编码等等都会需要用到编解码。编码8位二进制数据成ASCII码有一些通用的技术。

编码技术大都是将二进制数据转换成十六进制数据。UU编码是一种很早的编码标准,

主要用于新闻组和BBS传输二进制文件。Binhex编码主要用于Mac的系统。base64

是MIME的一种编码方式。这些编码技术基本上是在四个字节的ASCII码和三个字节的二进制数据之间转换,开始标记和结束标记等略有不同。QP编码也是一种MIME编码,不过它的编码长度是可变的,主要用于非ASCII码信息,对7位ASCII文本无需再次编码,仅将8位数据转换为7位。

Python提供了上述几种编码的相关模块。包装好的模块[uu],[binhex],[base64]和

[quopri]操作起来和文件对象差不多。当然之间也略有不同。例如[binhex]是在编码以

后才关闭输出文件,这使得它无法用于像[cStringIO]之类的文件对象。所有的这些编码工具都要使用到底层的C模块[binascii]。实际上真正执行转换的是[binascii]模块,不

过它不会区分正确的编码块大小。

标准库并没有提供通用的编解码功能,不过很容易就可以实现一个通用的编解码程序:#---------- encode_binary.py ----------#

# Provide encoders for arbitrary binary data

# in Python strings. Handles block size issues

# transparently, and returns a string.

# Precompression of the input string can reduce

# or eliminate any size penalty for encoding.

import sys

import zlib

import binascii

UU = 45

BASE64 = 57

BINHEX = sys.maxint

def ASCIIencode(s=, type=BASE64, compress=1):

"""ASCII文本转换为二进制数据"""

# 先选择编码方式

if type == BASE64: encode = binascii.b2a_base64

elif type == UU: encode = binascii.b2a_uu

elif type == BINHEX: encode = binascii.b2a_hqx

else: raise ValueError, "Encoding must be in UU, BASE64, BINHEX"

# 再判断是否进行压缩

if compress: s = https://www.360docs.net/doc/603777107.html,press(s)

# 一块一块开始编码

offset = 0

blocks = []

while 1:

blocks.append(encode(s[offset:offset+type]))

offset += type

if offset > len(s):

break

# 返回编码后的数据

return .join(blocks)

def ASCIIdecode(s=, type=BASE64, compress=1):

"""由二进制数据解码至ASCII文本"""

# 解码

if type == BASE64: s = binascii.a2b_base64(s)

elif type == BINHEX: s = binascii.a2b_hqx(s)

elif type == UU:

s = .join([binascii.a2b_uu(line) for line in s.split('\n')])

# 判断是否进行解压缩

if compress: s = zlib.decompress(s)

# 返回结果

return s

# Encode/decode STDIN for self-test

if __name__ == '__main__':

decode, TYPE = 0, BASE64

for arg in sys.argv:

if arg.lower()=='-d': decode = 1

elif arg.upper()=='UU': TYPE=UU

elif arg.upper()=='BINHEX': TYPE=BINHEX

elif arg.upper()=='BASE64': TYPE=BASE64

if decode:

print ASCIIdecode(sys.stdin.read(),type=TYPE)

else:

print ASCIIencode(sys.stdin.read(),type=TYPE)

上面的例子并没有包含任何头数据或需要的分界数据,这些可以通过使用[uu],[mimify]或[MimeWriter]来解决。或者你也可以编写自己需要的'encode_binary.py'.

主题-- 词频统计

分析文本里单词的出现频率是很有用的。在文字处理里,几乎要么是处理字节要么是处理单词。创建词频统计很简单,只需要使用Python字典就可以了,不过不是每个人都能立即找到最明显的解决方案。下面的这个例子有很好的通用性,提供了多种实用功能,并且还可用于命令行操作模式。

#---------- histogram.py ----------#

# 统计词频

# 有几个工具函数可以提取需要的结果

from string import split, maketrans, translate, punctuation, digits import sys

from types import *

import types

def word_histogram(source):

"""对词作统计(不包括标点和数字)"""

hist = {}

trans = maketrans(,)

if type(source) in (StringType,UnicodeType): # 字符串

for word in split(source):

word = translate(word, trans, punctuation+digits)

if len(word) > 0:

hist[word] = hist.get(word,0) + 1

elif hasattr(source,'read'): # 文件

try:

from xreadlines import xreadlines # 测试是否可用

for line in xreadlines(source):

for word in split(line):

word = translate(word, trans, punctuation+digits)

if len(word) > 0:

hist[word] = hist.get(word,0) + 1

except ImportError: # 使用旧版本

line = source.readline() # 速度慢,但内存占用少

while line:

for word in split(line):

word = translate(word, trans, punctuation+digits)

if len(word) > 0:

hist[word] = hist.get(word,0) + 1

line = source.readline()

else:

raise TypeError, \

"source must be a string-like or file-like object"

return hist

def char_histogram(source, sizehint=1024*1024):

hist = {}

if type(source) in (StringType,UnicodeType): # 字符串

for char in source:

hist[char] = hist.get(char,0) + 1

elif hasattr(source,'read'): # 文件

chunk = source.read(sizehint)

while chunk:

for char in chunk:

hist[char] = hist.get(char,0) + 1

chunk = source.read(sizehint)

else:

raise TypeError, \

"source must be a string-like or file-like object"

return hist

def most_common(hist, num=1):

pairs = []

for pair in hist.items():

pairs.append((pair[1],pair[0]))

pairs.sort()

pairs.reverse()

return pairs[:num]

def first_things(hist, num=1):

pairs = []

things = hist.keys()

things.sort()

for thing in things:

pairs.append((thing,hist[thing]))

pairs.sort()

return pairs[:num]

if __name__ == '__main__':

if len(sys.argv) > 1:

hist = word_histogram(open(sys.argv[1]))

else:

hist = word_histogram(sys.stdin)

print "Ten most common words:"

for pair in most_common(hist, 10):

print '\t', pair[1], pair[0]

print "First ten words alphabetically:"

for pair in first_things(hist, 10):

print '\t', pair[0], pair[1]

# a more practical command-line version might use:

# for pair in most_common(hist,len(hist)):

# print pair[1],'\t',pair[0]

几个设计的选择有些武断。词频统计里去除了标点符号,只保留字母,同时还区分大小写,这可能不是理想的选择。'first_things()'和'most_common()'只返回最初的几项排序结果。

取自"https://www.360docs.net/doc/603777107.html,/index.php/Tpip_210"

?1第二节-- 标准模块

?2主题-- 字符串基本操作

o 2.1模块-- string : 字符串基本操作

? 2.1.1常数:

? 2.1.2函数:

第二节-- 标准模块

主题-- 字符串基本操作

模块[string]是Python文本处理的核心模块。有很多其他模块会引用这个模块。[string]模块里大多数操作都在Python1.6+复制到字符串对象上了。直接使用字符串对象的操作要比使用模块里相应函数的速度快一些。有些字符串对象的操作和模块里的并不等

价,但这里仍会作以介绍。

参考:[str], [UserString]

模块-- string : 字符串基本操作

[string]模块(只有函数和常数,没有类)的函数都有一些共同的东西。

? 1. 字符串是不可变对象。这意味着不能更改字符串自身(很多其他语言里,字符串操作都是直接更改自身的)。[string]里模块函数都需要一个字符串作参数,然后返回一个新的字符串对象。通常的做法大多是使用赋值语句将返回结果绑定到同一个变量名称上。

例如:

>>> import string

>>> str = "Mary had a little lamb"

>>> str = string.replace(str, 'had', 'ate')

>>> str

'Mary ate a little lamb'

第一个字符串对象并不会改变,但在第一次操作以后这个对象就不再和任何变量名称有关系了,在运行时这样的对象会作废料收集和处理。总之,[string]模块的函数不会改变任何已有的字符串,但通过名称重新绑定可以看起来像作了改变。

? 2. 很多[string]模块的函数同样应用在字符串对象自身的方法上。使用字符串对象方法并不需要导入[string]模块,而且通常要比使用[string]模块函数速度要快。这些大多数都是使用同一个方法实现的。

? 3. 一个建议是使用'string.join(string.split(...))'来处理字符串分割和合并。更详细的介绍参看`string.join()`和`string.split()`里的讨论。

? 4. 巧妙的使用`string.replace()`模式。利用`string.replace()`可以填充字符串,有时结合其他技术会有惊人的表现。请参看`string.replace()`的讨论和样例。

? 5. 一个可变的字符串可以通过使用内置的列表对象来实现(或[array])。子串列表可以被修改或替换。使用[array]模块可以定义以字符为元素的字符串,同样具有索引下标操作和片操作。在需要完整字符串的时候用`"".join()`来建造一个真实的字符串。例如:>>> lst = ['spam','and','eggs']

>>> lst[2] = 'toast'

>>> print .join(lst)

spamandtoast

>>> print ' '.join(lst)

spam and toast

>>> import array

>>> a = array.array('c','spam and eggs')

>>> print .join(a)

spam and eggs

>>> a[0] = 'S'

>>> print .join(a)

Spam and eggs

>>> a[-4:] = array.array('c','toast')

>>> print .join(a)

Spam and toast

常数:

[string]模块的常数定义了一些常用的字符集。所有这些常数本身就是个字符串。如果你需要的话,还可以建立需要的字符集。例如:

>>> import string

>>> string.brackets = "[]{}()<>"

>>> print string.brackets

[]{}()<>

?string.digits

十进制数字("0123456789").

?string.hexdigits

十六进制数字("0123456789abcdefABCDEF").

?string.octdigits

八进制数字("01234567").

?string.lowercase

小写字母。

>>> import string

>>> string.lowercase

'abcdefghijklmnopqrstuvwxyz'

如果你需要使用特定的语言,不要直接修改`string.lowercase`,可以定义一个新的常数,如'string.spanish_lowercase'(有些函数会使用到这个常量)。

?string.uppercase

大写字母。

>>> import string

>>> string.uppercase

'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

如果你需要使用特定的语言,不要直接修改`string.uppercase`,可以定义一个新的常数,如'string.spanish_uppercase'(有些函数会使用到这个常量)。

?string.letters

所有的字母。(string.lowercase+string.uppercase).

?string.punctuation

标点符号。

>>> import string

>>> string.punctuation

'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

?string.whitespace

空白字符。包括tab,换行,vtab,回车,空格:

>>> import string

>>> string.whitespace

'\011\012\013\014\015 '

不要修改`string.whitespace`(有些函数会使用到这个常量)。

?string.printable

所有可以打印的字符

(string.digits+string.letters+string.punctuation+string.whitespace)

函数:

?string.atof(s=...)

不推荐使用。应该使用`float()`。

转换字符串为浮点数。

参考:`eval()`, `float()`

?string.atoi(s=... [,base=10])

Python2.0+不推荐使用。应该使用`int()`。

转换字符串为一个整数(第二个参数是使用的进制)

参考:`eval()`, `int()`, `long()`

?string.atol(s=... [,base=10])

Python2.0+不推荐使用。应该使用`long()`。

转换字符串为一个长整数(第二个参数是使用的进制)

参考:`eval()`, `long()`, `int()`

?string.capitalize(s=...)

?"".capitalize()

转换第一个字符为大写,所有其他字符转换为小写:

>>> import string

>>> string.capitalize("mary had a little lamb!")

'Mary had a little lamb!'

>>> string.capitalize("Mary had a Little Lamb!")

'Mary had a little lamb!'

>>> string.capitalize("2 Lambs had Mary!")

'2 lambs had mary!'

Python1.6+,直接使用字符串对象的方法快一些。可以这样用:>>> "mary had a little lamb".capitalize()

'Mary had a little lamb'

参考:`string.capwords()`, `string.lower()`

?string.capwords(s=...)

?"".title()

每个单词的第一个字符都转换为大写。同等的表达式是:

#*----- 等价于-----#

string.join(map(string.capitalize,string.split(s))

注意多余的空白会被消除:

>>> import string

>>> string.capwords("mary HAD a little lamb!")

'Mary Had A Little Lamb!'

>>> string.capwords("Mary had a Little Lamb!")

'Mary Had A Little Lamb!'

Python1.6+同等的字符串对象方法更名为`"".title()`。

参考:`string.capitalize()`, `string.lower()`, `"".istitle()`

?string.center(s=..., width=...)

?"".center(width)

在前后填充空格使长度达到'width'(不会截断超出长度的字符串)。>>> import string

>>> string.center(width=30,s="Mary had a little lamb")

' Mary had a little lamb '

>>> string.center("Mary had a little lamb", 5)

'Mary had a little lamb'

Python1.6+,直接使用字符串对象的方法快一些。可以这样用:>>> "Mary had a little lamb".center(25)

' Mary had a little lamb '

参考:`string.ljust()`, `string.rjust()`

?string.count(s, sub [,start [,end]])

?"".count(sub [,start [,end]])

统计匹配的子串个数。后两个参数用来限定比较的起止位置。

>>> import string

>>> string.count("mary had a little lamb", "a")

4

>>> string.count("mary had a little lamb", "a", 3, 10)

2

Python1.6+,直接使用字符串对象的方法快一些。可以这样用:

>>> 'mary had a little lamb'.count("a")

4

?"".endswith(suffix [,start [,end]])

[string]模块里没有这个字符串对象方法。用来检查最后几个字符是否和参数'suffix'一样。后两个参数用来限定比较的起止位置。

参考:`"".startswith()`, `string.find()`

?string.expandtabs(s=... [,tabsize=8])

?"".expandtabs([,tabsize=8])

将tab换成空格。参数指定一个tab对应的空格长度。默认长度为8。

>>> import string

>>> s = 'mary\011had a little lamb'

>>> print s

mary had a little lamb

>>> string.expandtabs(s, 16)

'mary had a little lamb'

>>> string.expandtabs(tabsize=1, s=s)

'mary had a little lamb'

Python1.6+,直接使用字符串对象的方法快一些。可以这样用:

>>> 'mary\011had a little lamb'.expandtabs(25)

'mary had a little lamb'

?string.find(s, sub [,start [,end]])

?"".find(sub [,start [,end]])

查找子串第一次出现的位置。后两个参数用来限定比较的起止位置。如果未找到返回-1。>>> import string

>>> string.find("mary had a little lamb", "a")

1

>>> string.find("mary had a little lamb", "a", 3, 10)

6

>>> string.find("mary had a little lamb", "b")

21

>>> string.find("mary had a little lamb", "b", 3, 10)

-1

Python1.6+,直接使用字符串对象的方法快一些。可以这样用:

>>> 'mary had a little lamb'.find("ad")

6

参考:`string.index()`, `string.rfind()`

?string.index(s, sub [,start [,end]])

?"".index(sub [,start [,end]])

和`string.find()`差不多,只是如果未找到会抛出'ValueError'而不是返回-1。>>> import string

>>> string.index("mary had a little lamb", "b")

21

>>> string.index("mary had a little lamb", "b", 3, 10)

Traceback (most recent call last):

File "", line 1, in ?

File "d:/py20sl/lib/string.py", line 139, in index

return s.index(*args)

ValueError: substring not found in string.index

Python1.6+,直接使用字符串对象的方法快一些。可以这样用:

>>> 'mary had a little lamb'.index("ad")

6

参考:`string.find()`, `string.rindex()`

'.is*()'函数用来检查字符串是否是由相应的字符组成的,[string]模块里没有相应的函数:

?"".isalpha()

是否都是字母。

?"".isalnum()

是否都是字母加数字。

?"".isdigit()

是否都是数字字符。

?"".islower()

所含字母是否都是小写字母:

>>> "ab123".islower(), '123'.islower(), 'Ab123'.islower()

(1, 0, 0)

参考:`"".lower()`

?"".isspace()

是否都是空白字符。

?"".istitle()

每个单词是否第一个字符都是大写其他小写。

参考:`"".title()`

?"".isupper()

所含字母是否都是大写字母:

参考:`"".upper()`

?string.join(words=... [,sep=" "])

?"".join(words)

连接列表里各个子字符串组成一个新字符串,参数'sep'是间隔使用的字符串。

值得注意的是,`string.join()`和`string.split()`函数是互逆的。换句话说

'string.join(string.split(s,sep),sep)==s'肯定是真。

通常情况下,`string.join()`中使用都是自然生成的字符串列表。举例来说,这个小程序里的列表就是按输入顺序构成的:

#---------- list_capwords.py ----------#

import string,sys

capwords = []

for line in sys.stdin.readlines():

for word in line.split():

if word == word.upper() and word.isalpha():

capwords.append(word)

print string.join(capwords, '\n')

在'list_capwords.py'里利用连接使用字符串的效率还不错。如果使用Python2.0里增加的加法操作则会降低执行速度:

>>> import string

>>> s = "Mary had a little lamb"

>>> t = "its fleece was white as snow"

>>> s = s +" "+ t # 效率一般,如果是长字符串会较低

>>> s += " " + t # 效率低

>>> lst = [s]

>>> lst.append(t) # 效率更低

>>> s = string.join(lst)

>>> s = string.join((s," ",t)) # 效率高

Python1.6+,使用`"".join()`的效率是最高的。

参考:`string.split()`

?string.joinfields(...)

和`string.join()`一样。

?string.ljust(s=..., width=...)

?"".ljust(width)

后补空格。(不会截断字符串)

>>> import string

>>> string.ljust(width=30,s="Mary had a little lamb")

'Mary had a little lamb '

>>> string.ljust("Mary had a little lamb", 5)

'Mary had a little lamb'

Python1.6+,直接使用字符串对象的方法快一些。可以这样用:

>>> "Mary had a little lamb".ljust(25)

'Mary had a little lamb '

参考:`string.rjust()`, `string.center()`

?string.lower(s=...)

?"".lower()

转换大写字母为小写。

>>> import string

>>> string.lower("mary HAD a little lamb!")

'mary had a little lamb!'

>>> string.lower("Mary had a Little Lamb!")

'mary had a little lamb!'

Python1.6+,直接使用字符串对象的方法快一些。可以这样用:

>>> "Mary had a Little Lamb!".lower()

'mary had a little lamb!'

参考:`string.upper()`

?string.lstrip(s=...)

?"".lstrip([chars=string.whitespace])

删除左边的空白字符。Python1.6+,直接使用字符串对象的方法快一些。可以这样用:>>> import string

>>> s = """

... Mary had a little lamb \011"""

>>> string.lstrip(s)

'Mary had a little lamb \011'

>>> s.lstrip()

'Mary had a little lamb \011'

Python2.3+可以指定需要删除的字符。

参考:`string.rstrip(), `string.strip()`

?string.maketrans(from, to)

制作字符转换表,用于`string.translate()`。参数'from'和'to'必须是相同的长度。转换表是一个长度为256的字符串,每个字符对应相应的字节值。

>>> import string

>>> ord('A')

65

>>> ord('z')

122

>>> string.maketrans('ABC','abc')[65:123]

'abcDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz'

>>> string.maketrans('ABCxyz','abcXYZ')[65:123]

'abcDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwXYZ'

参考:`string.translate()`

?string.replace(s=..., old=..., new=... [,maxsplit=...])

?"".replace(old, new [,maxsplit])

替换操作。最后一个参数限定最大替换次数。

>>> import string

>>> string.replace("Mary had a little lamb", "a little", "some")

'Mary had some lamb'

Python1.6+,直接使用字符串对象的方法快一些。可以这样用:

>>> "Mary had a little lamb".replace("a little", "some")

'Mary had some lamb'

使用`string.replace()`的多次替换时需要注意是否把不期望替换的也替换了。有时可以使用保留字符串来解决这个问题。当然使用正则表达式也可以达到同样的目的,但是使用`string.replace()`会更快一些:

>>> import string

>>> line = 'variable = val # see comments #3 and #4'

>>> # 现在想把'#3'和'#4'中的'#'替换为'number'

>>> string.replace(line,'#','number ') # 没成功

'variable = val number see comments number 3 and number 4'

>>> place_holder=string.replace(line,' # ',' !!! ') # 保留不替换的

>>> place_holder

'variable = val !!! see comments #3 and #4'

>>> place_holder=place_holder.replace('#','number ') # 替换完了

>>> place_holder

'variable = val !!! see comments number 3 and number 4'

>>> line = string.replace(place_holder,'!!!','#') # 再换回原来的

>>> line

'variable = val # see comments number 3 and number 4'

显然,对于这样的工作,需要仔细处理。特别是要注意作为保留替换的字符串是否是子串。

参考:`string.translate()`, `mx.TextTools.replace()`

?string.rfind(s, sub [,start [,end]])

?"".rfind(sub [,start [,end]])

从右边开始查找子串第一次出现的位置。后两个参数用来限定比较的起止位置。如果未找到返回-1。

>>> import string

>>> string.rfind("mary had a little lamb", "a")

19

>>> string.rfind("mary had a little lamb", "a", 3, 10)

9

>>> string.rfind("mary had a little lamb", "b")

21

>>> string.rfind("mary had a little lamb", "b", 3, 10)

-1

Python1.6+,直接使用字符串对象的方法快一些。可以这样用:

>>> 'mary had a little lamb'.rfind("ad")

6

参考:`string.rindex()`, `string.find()`

?string.rindex(s, sub [,start [,end]])

?"".rindex(sub [,start [,end]])

python的中文处理

Python的中文处理 一、使用中文字符 在python源码中如果使用了中文字符,运行时会有错误,解决的办法是在源码的开头部分加入字符编码的声明,下面是一个例子: #!/usr/bin/env python # -*- coding: cp936 -*- Python Tutorial中指出,python的源文件可以编码ASCII以外的字符集,最好的做法是在#!行后面用一个特殊的注释行来定义字符集: # -*- coding: encoding -*- 根据这个声明,Python会尝试将文件中的字符编码转为encoding编码,并且,它尽可能的将指定地编码直接写成Unicode文本。 注意,coding:encoding只是告诉Python文件使用了encoding格式的编码,但是编辑器可能会以自己的方式存储.py文件,因此最后文件保存的时候还需要编码中选指定的ecoding 才行。 二、中文字符的存储 >>> str = u"中文" >>> str u'\xd6\xd0\xce\xc4' >>> str = "中文" >>> str '\xd6\xd0\xce\xc4' u"中文"只是声明unicode,实际的编码并没有变。这样子就发生变化了: >>> str = "中文" >>> str '\xd6\xd0\xce\xc4' >>> str = str.decode("gb2312") >>> str u'\u4e2d\u6587' 更进一步: >>> s = '中文' >>> s.decode('gb2312') u'\u4e2d\u6587' >>> len(s) 4 >>> len(s.decode('gb2312')) 2 >>> s = u'中文'

python基础知识以九九乘法表实例学循环-字符串-列表推导式

Python基础知识:以九九乘法表实例学循环/字符串/ 列表推导式 九九乘法表可以说是我们每个人小的时候,学数认字以来第一个要背诵的数学口诀,没有人不认识它。 下面我们看看在python中如何实现它吧,实现的打印效果如下图所示: 方法1:常规思维版 定义了一个函数myFunc1,其思路同C/C++语言通用实现方法类似,使用两层for循环,外层控制行的转换,内层控制列的口诀输出,代码如下图所示: 打印结果信息时,使用了format函数转换为字符串。每列中每条口诀之间使用“\t”分割,每行之间使用上图的第15行代码换行。 方法2:优雅简洁版 定义了一个函数myFunc2,使用了join函数和列表推导式的

方法实现,代码如下图所示: 1、对于列表推导式,也可以参考例子: 其通用的书写形式如下: [表达式for 变量in 列表] 或者[表达式for 变量in 列表if 条件] 列表推导式内部也可以嵌套使用,如上面代码的实现。 2、对于join函数,其功能是将序列(如字符串、元组、列表等)中的元素以特定的分隔符连接成一个新的字符串。其使用格式如下: ‘‘sep’’.join(seq) 其中,sep是指分隔符,seq是要连接的元素序列。 完整的测试代码 完整的测试代码如下图所示: 说明:本例中python的运行版本是2.7.14,为实现print函数不换行打印的功能(第14行代码,python3系列可直接支持),所以增加了第9行代码“from __future__ import print_function”,以便python2系列中print函数能够支持end 关键字。

Python基本操作题

1.请补充横线处的代码,让Python 帮你随机选一个饮品吧! import ____①____ (1) listC = ['加多宝','雪碧','可乐','勇闯天涯','椰子汁'] print(random. ____②____ (listC)) 参考答案: import random (1) listC = ['加多宝','雪碧','可乐','勇闯天涯','椰子汁'] print(listC)) 2.请补充横线处的代码,listA中存放了已点的餐单,让Python帮你增加一个“红烧肉”,去掉一个“水煮干丝”。 listA = ['水煮干丝','平桥豆腐','白灼虾','香菇青菜','西红柿鸡蛋汤'] listA. ____①____ ("红烧肉") ②____ ("水煮干丝") print(listA) 参考代码: listA = ['水煮干丝','平桥豆腐','白灼虾','香菇青菜','西红柿鸡蛋汤'] ("红烧肉") ("水煮干丝") print(listA) 3.请补充横线处的代码。dictMenu中存放了你的双人下午套餐(包括咖啡2份和点心2份)的价格,让Python帮忙计算并输出消费总额。 dictMenu = {'卡布奇洛':32,'摩卡':30,'抹茶蛋糕':28,'布朗尼':26} ___①____ for i in ____②____: sum += i print(sum) 参考代码: dictMenu = {'卡布奇洛':32,'摩卡':30,'抹茶蛋糕':28,'布朗尼':26} sum = 0 for i in (): sum += i print(sum) 4.获得输入正整数 N,反转输出该正整数,不考虑异常情况。 参考代码: N = input() print(N[::-1]) 5. 给定一个数字123456,请采用宽度为25、右对齐方式打印输出,使用加号“+”填充。 参考代码: print("{:+>25}".format(123456)) 6.给定一个数字.9,请增加千位分隔符号,设置宽度为30、右对齐方式打印输出,使用空格填充。 参考代码:

Python3 常用函数

Python3 常用函数.笔记 Python 3自学.笔记 type()检查变量数据: >>> x = 10 >>> type(x) (cla ss ‘int’) exit( ) 执行到此命令时,程序终止:!!! >>> a = 0 >>> w hile a < 20: a = a + 1 if a == 5: else:#执行到此命令时,程序终止 a = 100 >>> print(a) 5 abs()返回一个数的绝对值: >>> abs(3) 3 >>> abs(-3) 3 while _ _ _ : 循环执行程序: >>> n = 0 >>> w hile n < 3:#(a n d/o r/n o t) n = n + 1 print(n) Continue 继续下一轮循环 Break 退出整个循环 round()对小数进行四舍五入操作: >>> x = 3.1415926 >>> round(x , 2) #保留2位小数

3.14 for _ _ _ in _ _ _ : 可以遍历任何序列的项目(如一个列表或者一个字符串): >>> s = 'a bc def123456' >>> for i in s: print(i) a b c d ...... range( ) 返回一个可迭代对象: >>> range(20) range(0, 20) #默认以0开始 >>> a = 20 >>> for i in ra nge(0 , a , 5): #步长为:5(默认步长为1)print(i) 5 10 15 #计数到20但不包括20 >>> break 退出整个循环: >>> i = 0 >>> w hile i < 10: i = i + 1 if i == 5: Break #执行到此时退出循环结构 >>> print(i) 5 字符串:

python语言经典基础级案例(含源代码)

python语言经典案例(基础级) 案例1: 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 程序分析:利用while 或for 语句,条件为输入的字符不为'\n'。 实例- 使用while 循环 #!/usr/bin/python # -*- coding: UTF-8 -*- import string s = raw_input('请输入一个字符串:\n') letters = 0 space = 0 digit = 0 others = 0 i=0 while i < len(s): c = s[i] i += 1 if c.isalpha(): letters += 1 elif c.isspace(): space += 1 elif c.isdigit(): digit += 1 else: others += 1 print'char = %d,space = %d,digit = %d,others = %d' % (letters, space,digit,others) 实例- 使用for 循环 #!/usr/bin/python

# -*- coding: UTF-8 -*- import string s = raw_input('请输入一个字符串:\n') letters = 0 space = 0 digit = 0 others = 0 for c in s: if c.isalpha(): letters += 1 elif c.isspace(): space += 1 elif c.isdigit(): digit += 1 else: others += 1 print'char = %d,space = %d,digit = %d,others = %d' % (letters, space,digit,others) 以上实例输出结果为: 案例2: 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? 程序分析:无 程序源代码:

python字符串内置函数

a='helLO' print(a.title()) # 首字母大写a='1 2'

执行结果:1 2 1 2 1 2 00000001 2 1 2 3 4 5 6 7 8 # 3 字符串搜索相关 .find() # 搜索指定字符串,没有返回-1 .index() # 同上,但是找不到会报错 .rfind() # 从右边开始查找 .count() # 统计指定的字符串出现的次数 # 上面所有方法都可以用index代替,不同的是使用index查找不到会抛异常,而find s='hello world' print(s.find('e')) # 搜索指定字符串,没有返回-1 print(s.find('w',1,2)) # 顾头不顾尾,找不到则返回-1不会报错,找到了 则显示索引 print(s.index('w',1,2)) # 同上,但是找不到会报错 print(s.count('o')) # 统计指定的字符串出现的次数 print(s.rfind('l')) # 从右边开始查找 # 4字符串替换 .replace('old','new') # 替换old为new .replace('old','new',次数) # 替换指定次数的old为new s='hello world' print(s.replace('world','python')) print(s.replace('l','p',2)) print(s.replace('l','p',5)) 执行结果: hello python heppo world heppo worpd

# 5字符串去空格及去指定字符 .strip() # 去两边空格 .lstrip() # 去左边空格 .rstrip() # 去右边空格 .split() # 默认按空格分隔 .split('指定字符') # 按指定字符分割字符串为数组 s=' h e-l lo ' print(s) print(s.strip()) print(s.lstrip()) print(s.rstrip()) print(s.split('-')) print(s.split()) # 6字符串判断相关 .startswith('start') # 是否以start开头 .endswith('end') # 是否以end结尾 .isalnum() # 是否全为字母或数字 .isalpha() # 是否全字母 .isdigit() # 是否全数字 .islower() # 是否全小写 .isupper() # 是否全大写 .istitle() # 判断首字母是否为大写 .isspace() # 判断字符是否为空格 # 补充 bin() # 十进制数转八进制 hex() # 十进制数转十六进制 range() # 函数:可以生成一个整数序列 type() # 查看数据类型 len() # 计算字符串长度 format() # 格式化字符串,类似%s,传递值能多不能少

最新python常用函数资料

1.map()函数map()是Python 内置的高阶函数,它接收一个函数f和一个list,并通过把函数 f 依次作用在list 的每个元素上,得到一个新的list 并返回。 例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9] 如果希望把list的每个元素都作平方,就可以用map()函数: 因此,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算: def f(x): return x*x print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) 输出结果: [1, 4, 9, 10, 25, 36, 49, 64, 81] 可以用列表替代 注意:map()函数不改变原有的list,而是返回一个新的list。

利用map()函数,可以把一个list 转换为另一个list,只需要传入转换函数。 由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的list,事实上它可以处理包含任意类型的list,只要传入的函数f可以处理这种数据类型。 假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则,请利用map()函数,把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的list: 输入:['adam', 'LISA', 'barT'] 输出:['Adam', 'Lisa', 'Bart'] format_name(s)函数接收一个字符串,并且要返回格式化后的字符串,利用map()函数,就可以输出新的list。 参考代码: def format_name(s): return s[0].upper() + s[1:].lower() print map(format_name, ['adam', 'LISA', 'barT']) 2.reduce()函数 reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和map()类似,一个函数f,一个list,但行为和map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list 的每个元素反复调用函数f,并返回最终结果值。 例如,编写一个f函数,接收x和y,返回x和y的和: def f(x, y): return x + y 调用reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:

【IT专家】Python-分割字符串,尊重和保留引号[重复]

本文由我司收集整编,推荐下载,如有疑问,请与我司联系Python:分割字符串,尊重和保留引号[重复] Python:分割字符串,尊重和保留引号[重复][英]Python: Split a string, respect and preserve quotes [duplicate]Using python, I want to split the following string: ?使用python,我想拆分如下字符串: a=foo, b=bar, c=“foo, bar”, d=false, e=“false” This should result in the following list: 这应导致下列清单: ?[‘a=foo’, ‘b=bar’, ‘c=“foo, bar”‘, ‘d=false’, ‘e=“false’”‘] When using shlex in posix-mode and splitting with “, “, the argument for cgets treated correctly. However, it removes the quotes. I need them because false is not the same as “false”, for instance. ?当在posix模式下使用shlex并使用“,”拆分时,clex的参数得到了正确的处理。但是,它删除了引号。我需要它们,因为false和false不一样。 My code so far: ?到目前为止我的代码: ?import shlexmystring = ‘a=foo, b=bar, c=“foo, bar”, d=false, e=“false”‘splitter = shlex.shlex(mystring, posix=True)splitter.whitespace += ‘,’splitter.whitespace_split = Trueprint list(splitter) # [‘a=foo’, ‘b=bar’, ‘c=foo, bar’, ‘d=false’, ‘e=false’] 19 s = r’a=foo, b=bar, c=“foo, bar”, d=false, e=“false”, f=“foo\”, bar”‘ re.findall(e (?: | )+ matches a sequence of non-delimiters and quoted strings, which is the desired result. 将模式2和3组合在一起(?: |)+匹配一个非分隔符和引号字符串序列,这是期望的结果。0 ?Regex can solve this easily enough: ?Regex可以很容易地解决这个问题: ?import remystring = ‘a=foo, b=bar, c=“foo, bar”, d=false, e=“false”‘splitString = re.split(‘,?\s(?=\w+=)’,mystring) The regex pattern here looks for a whitespace followed by a word character and then an equals sign which splits your string as you desire and maintains any quotes.

Python 的内置字符串方法

字符串处理是非常常用的技能,但Python 内置字符串方法太多,常常遗忘,为了便于快速参考,特地依据Python 3.5.1 给每个内置方法写了示例并进行了归类,便于大家索引。 PS: 可以点击概览内的绿色标题进入相应分类或者通过右侧边栏文章目录快速索引相应方法。 概览 字符串大小写转换 ?str.capitalize() ?str.lower() ?str.casefold() ?str.swapcase() ?str.title() ?str.upper() 字符串格式输出 ?str.center(width[, fillchar]) ?str.ljust(width[, fillchar]); str.rjust(width[, fillchar]) ?str.zfill(width) ?str.expandtabs(tabsize=8)

?str.format(^args, ^^kwargs) ?str.format_map(mapping) 字符串搜索定位与替换 ?str.count(sub[, start[, end]]) ?str.find(sub[, start[, end]]); str.rfind(sub[, start[, end]]) ?str.index(sub[, start[, end]]); str.rindex(sub[, start[, end]]) ?str.replace(old, new[, count]) ?str.lstrip([chars]); str.rstrip([chars]); str.strip([chars]) ?static str.maketrans(x[, y[, z]]); str.translate(table) 字符串的联合与分割 ?str.join(iterable) ?str.partition(sep); str.rpartition(sep) ?str.split(sep=None, maxsplit=-1); str.rsplit(sep=None, maxsplit=-1) ?str.splitlines([keepends]) 字符串条件判断 ?str.endswith(suffix[, start[, end]]); str.startswith(prefix[, start[, end]]) ?str.isalnum() ?str.isalpha() ?str.isdecimal(); str.isdigit(); str.isnumeric() ?str.isidentifier()

python常用函数年初大总结

1.常用内置函数:(不用import就可以直接使用) help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像函数一样调用 repr(obj) 得到obj的表示字符串,可以利用这个字符串eval重建该对象的一个拷贝 eval_r(str) 表示合法的python表达式,返回这个表达式 dir(obj) 查看obj的name space中可见的name hasattr(obj,name) 查看一个obj的name space中是否有name getattr(obj,name) 得到一个obj的name space中的一个name setattr(obj,name,value) 为一个obj的name space中的一个name指向vale这个object delattr(obj,name) 从obj的name space中删除一个name vars(obj) 返回一个object的name space。用dictionary表示 locals() 返回一个局部name space,用dictionary表示 globals() 返回一个全局name space,用dictionary表示 type(obj) 查看一个obj的类型 isinstance(obj,cls) 查看obj是不是cls的instance issubclass(subcls,supcls) 查看subcls是不是supcls的子类 类型转换函数 chr(i) 把一个ASCII数值,变成字符 ord(i) 把一个字符或者unicode字符,变成ASCII数值 oct(x) 把整数x变成八进制表示的字符串 hex(x) 把整数x变成十六进制表示的字符串

python经典实例

1 输出你好 #打开新窗口,输入: #! /usr/bin/python # -*- coding: utf8 -*- s1=input("Input your name:") print("你好,%s" % s1) ''' 知识点: * input("某字符串")函数:显示"某字符串",并等待用户输入. * print()函数:如何打印. * 如何应用中文 * 如何用多行注释 ''' 2 输出字符串和数字 但有趣的是,在javascript里我们会理想当然的将字符串和数字连接,因为是动态语言嘛.但在Python里有点诡异,如下: #! /usr/bin/python a=2 b="test" c=a+b 运行这行程序会出错,提示你字符串和数字不能连接,于是只好用内置函数进行转换 #! /usr/bin/python #运行这行程序会出错,提示你字符串和数字不能连接,于是只好用内置函数进行转换 a=2 b="test" c=str(a)+b d="1111" e=a+int(d) #How to print multiply values print ("c is %s,e is %i" % (c,e)) ''' 知识点: * 用int和str函数将字符串和数字进行转换 * 打印以#开头,而不是习惯的// * 打印多个参数的方式 '''

3 列表 #! /usr/bin/python # -*- coding: utf8 -*- #列表类似Javascript的数组,方便易用 #定义元组 word=['a','b','c','d','e','f','g'] #如何通过索引访问元组里的元素 a=word[2] print ("a is: "+a) b=word[1:3] print ("b is: ") print (b) # index 1 and 2 elements of word. c=word[:2] print ("c is: ") print (c) # index 0 and 1 elements of word. d=word[0:] print ("d is: ") print (d) # All elements of word. #元组可以合并 e=word[:2]+word[2:] print ("e is: ") print (e) # All elements of word. f=word[-1] print ("f is: ") print (f) # The last elements of word. g=word[-4:-2] print ("g is: ") print (g) # index 3 and 4 elements of word. h=word[-2:] print ("h is: ") print (h) # The last two elements. i=word[:-2] print ("i is: ") print (i) # Everything except the last two characters l=len(word) print ("Length of word is: "+ str(l)) print ("Adds new element") word.append('h') print (word) #删除元素 del word[0] print (word) del word[1:3] print (word) ''' 知识点:

python字符串常用函数

字符串常用函数 replace(string,old,new[,maxsplit]) 字符串的替换函数,把字符串中的old替换成new。默认是把string中所有的old值替换成new 值,如果给出maxsplit值,还可控制替换的个数,如果maxsplit为1,则只替换第一个old 值。 >>>a="11223344" >>>print string.replace(a,"1","one") oneone2223344 >>>print string.replace(a,"1","one",1) one12223344 capitalize(string) 该函数可把字符串的首个字符替换成大字。 >>> import string >>> print string.capitalize("python") Python split(string,sep=None,maxsplit=-1) 从string字符串中返回一个列表,以sep的值为分界符。 >>> import string >>> ip="192.168.3.3" >>> ip_list=string.split(ip,'.') >>> print ip_list ['192', '168', '3', '3'] all( iterable) 如果迭代的所有元素都是真就返回真。 >>> l = [0,1,2,3] >>> all(l) Flase >>> l = [1,2,3] >>> all(l) True any( iterable) 如果迭代中有一个元素为真就返回真。 >>> l = [0,1,2,3] >>> all(l) True >>> l = [1,2,3] >>> all(l) True basestring() 这个抽象类型是str和unicode的父类。它不能被调用或初始化,但是它可以使用来测试一

Python 常用函数

Python 函数 2016年4月14日 22:07 1、join()函数 以下实例展示了join()的使用方法: #!/usr/bin/python str ="-"; seq =("a","b","c");# 字符串序列 print str.join( seq ); 以上实例输出结果如下: a-b-c 2、str.zfill(width) 将字符串str前面补0使得字符串长度为width 3、lambda函数(匿名函数) a. lambda表达式返回可调用的函数对象.但不会把这个函 数对象赋给一个标识符,而def则会把函数对象赋值给一个变 量. https://www.360docs.net/doc/603777107.html,mbda 它只是一个表达式,而def是一个语句 c.定义一些抽象的,不会别的地方再复用的函数 d. lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒 号右边的返回值 定义了一个lambda表达式,求三个数的和。 用lambda表达式求n的阶乘。 这里也可以把def直接写成lambda形式。如下 lambda函数可以很好和python中内建filter(),map(),reduce()函数的应用程序结合起来,因为它们都带了一个可执行的函数对象. 4、filter(function or None, sequence) -> list, tuple, or string 给定一个'过滤函数'和一个对象的序列,每个序列元素都通过这个过滤器进行筛选,保留函数返回为真的对象.filter函数为已知的序列的每个元素调用给定布尔函数.每个filter返回的非零(true)值元素添加到一个列表中. 1 2 3 #!/usr/bin/python2.5 from random import randint

Python内置的字符串处理函数整理字符串长度获取

Python内置的字符串处理函数整理字符串长度获取:len(str)例:print'%slengt By xuanfeng6666 at 2014-06-01 139 阅读 0 回复 0.0 希赛币 Python内置的字符串处理函数整理 ?字符串长度获取:len(str) 例:print '%s length=%d' % (str,len(str)) ?字母处理 全部大写:str.upper() 全部小写:str.lower() 大小写互换:str.swapcase() 首字母大写,其余小写:str.capitalize() 首字母大写:str.title() print '%s lower=%s' % (str,str.lower()) print '%s upper=%s' % (str,str.upper()) print '%s swapcase=%s' % (str,str.swapcase()) print '%s capitalize=%s' % (str,str.capitalize()) print '%s title=%s' % (str,str.title()) ?格式化相关 获取固定长度,右对齐,左边不够用空格补齐:str.rjust(width) 获取固定长度,左对齐,右边不够用空格补齐:str.ljust(width) 获取固定长度,中间对齐,两边不够用空格补齐:str.center(width) 获取固定长度,右对齐,左边不足用0补齐.zfill(width) print '%s ljust=%s' % (str,str.ljust(20))

Python如何针对任意多的分隔符拆分字符串操作

Python如何针对任意多的分隔符拆分字符串操作 本篇文章小编和大家分享一下Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作,文中会结合实例形式进行分析Python使用split()及正则表达式进行字符串拆分操作相关实现技巧,对Python开发感兴趣或者是想要学习Python开发技术的小伙伴可以参考下哦。 问题:将分隔符(以及分隔符之间的空格)不一致的字符串拆分为不同的字段。 解决方案:使用更为灵活的re.split()方法,该方法可以为分隔符指定多个模式。 说明:字符串对象的split()只能处理简单的情况,而且不支持多个分隔符,对分隔符周围可能存在的空格也无能为力。 # example.py # # Example of splitting a string on multiple delimiters using a regex import re #导入正则表达式模块 line = 'asdf fjdk; afed, fjek,asdf, foo' # (a) Splitting on space, comma, and semicolon parts = re.split(r'[;,\s]\s*', line) print(parts) # (b) 正则表达式模式中使用“捕获组”,需注意捕获组是否包含在括号中,使用捕获组导致匹配的文本也包含在最终结果中 fields = re.split(r'(;|,|\s)\s*', line) print(fields) # (c) 根据上文的分隔字符改进字符串的输出 values = fields[::2] delimiters = fields[1::2] delimiters.append('') print('value =', values) print('delimiters =', delimiters) newline = ''.join(v+d for v,d in zip(values, delimiters)) print('newline =', newline) # (d) 使用非捕获组(?:...)的形式实现用括号对正则表达式模式分组,且不输出分隔符 parts = re.split(r'(?:,|;|\s)\s*', line)

【IT专家】python 字符串操作

本文由我司收集整编,推荐下载,如有疑问,请与我司联系 python 字符串操作 2017/08/24 0 name=“My \t name is {name} and age is {age}”print(name.capitalize()) #将name的值首字母大写print(name.count(“a”)) #输出a这个字符的出现的个数print(name.center(50,”-”)) #一共打印50个,其他用-代替print(name.endswith(“ex”)) #结尾是否包含exprint(name.expandtabs(tabsize=30)) #将字符串中的\t 转化为30个空格print(name[name.find(“name”):]) #find查找的意思字符串也可以进行切片,返回的结果为name及后面的一行内容 print(name.format(name=“wang”,age=23))print(name.format_map({“name”:”wang”,”age ”:23})) #字典的格式。。和format的结果一样print(“ab123”.isalnum()) #判断是否包含字母和数字,如果包含则返回为trueprint(“ab124”.isalpha()) #判断是否包含纯英文字符,如果是则返回为true,大小写不区分print(“122”.isdigit()) #判断是否为整数,如果为整数则返回为trueprint(“al1”.isidentifier()) #判断是不是一个合法的标识符(就是判断是不是合法的变量名)print(“aLL”.islower()) #判断是不是小写,是则返回trueprint(“aLL”.isnumeric()) #判断是不是数字,是则返回trueprint(“aLL”.isspace()) #判断是不是空格print(“My Name Is “.istitle()) #判断每个字符串的首字母大写,是的话就为trueprint(“my name is “.isupper())#判断是否是大写print(‘+’.join([‘1’,’2’,’3’])) #将列表的值转变为字符串的形式这个输出结果为:1+2+3print(name.ljust(50,”*”))print(name.rjust(50,”*”))print(“WANG”.lower())#将大写变成小写print(“wang”.upper()) #将小写边城大写print(“\nwang”.lstrip()) #取消左边的空格和回车print(“wang1\n”.rstrip())#去掉右边的空格和回车print(“ \nabng\n”.strip())#将左边和右边的空格和回车都去掉print(“wang han”.replace(‘a’,’A’,1))#将字符串中的a替换为大写的A,只替换其中一个print(‘wang wang’.rfind(‘a’)) #找到最右边的那个字符的下标print(‘1+2+3+4’.split(‘+’)) #以+号为分隔符,输出为列表的格式print(‘wang LI’.swapcase()) #将大写小反转print(‘wang han’.title()) #将每个字符串的首字母大写 ?tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

python常用函数

1.map()函数 map()是Python 内置的高阶函数,它接收一个函数f和一个list,并通过把函数f 依次作用在li st 的每个元素上,得到一个新的list 并返回。 例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9] 如果希望把list的每个元素都作平方,就可以用map()函数: 因此,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算: def f(x): return x*x print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) 输出结果: [1, 4, 9, 10, 25, 36, 49, 64, 81] 可以用列表替代 注意:map()函数不改变原有的list,而是返回一个新的list。

利用map()函数,可以把一个list 转换为另一个list,只需要传入转换函数。 由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的list,事实上它可以处理包含任意类型的list,只要传入的函数f可以处理这种数据类型。 假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则,请利用map()函数,把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的list: 输入:['adam', 'LISA', 'barT'] 输出:['Adam', 'Lisa', 'Bart'] format_name(s)函数接收一个字符串,并且要返回格式化后的字符串,利用map()函数,就可以输出新的list。 参考代码: def format_name(s): return s[0].upper() + s[1:].lower() print map(format_name, ['adam', 'LISA', 'barT']) 2.reduce()函数 reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和map()类似,一个函数f,一个list,但行为和map()不同,reduce()传入的函数f 必须接收两个参数,reduce()对list 的每个元素反复调用函数f,并返回最终结果值。 例如,编写一个f函数,接收x和y,返回x和y的和: def f(x, y): return x + y 调用reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:

Python-字符串操作方法

Python-字符串操作方法(转) Posted on 2008-09-05 19:22 ∈鱼杆阅读(2111) 评论(1) 编辑收藏网摘所属分类: Python Python-String-Function 字符串中字符大小写的变换: * S.lower() #小写 * S.upper() #大写 * S.swapcase() #大小写互换 * S.capitalize() #首字母大写 * String.capwords(S) #这是模块中的方法。它把S用split()函数分开,然后用capitalize()把首字母变成大写,最后用join()合并到一起 * S.title() #只有首字母大写,其余为小写,模块中没有这个方法 字符串在输出时的对齐: * S.ljust(width,[fillchar]) #输出width个字符,S左对齐,不足部分用fillchar填充,默认的为空格。 * S.rjust(width,[fillchar]) #右对齐 * S.center(width, [fillchar]) #中间对齐 * S.zfill(width) #把S变成width长,并在右对齐,不足部分用0补足 字符串中的搜索和替换: * S.find(substr, [start, [end]]) #返回S中出现substr的第一个字母的标号,如果S中没有substr则返回-1。start和end作用就相当于在S[start:end]中搜索 * S.index(substr, [start, [end]]) #与find()相同,只是在S中没有substr时,会返回一个运行时错误 * S.rfind(substr, [start, [end]]) #返回S中最后出现的substr的第一个字母的标号,如果S中没有substr则返回-1,也就是说从右边算起的第一次出现的substr的首字母标号 * S.rindex(substr, [start, [end]]) * S.count(substr, [start, [end]]) #计算substr在S中出现的次数 * S.replace(oldstr, newstr, [count]) #把S中的oldstar替换为newstr,count为替换次数。这是替换的通用形式,还有一些函数进行特殊字符的替换 * S.strip([chars]) #把S中前后chars中有的字符全部去掉,可以理解为把S前后chars替换为None * S.lstrip([chars]) * S.rstrip([chars]) * S.expandtabs([tabsize]) #把S中的tab字符替换没空格,每个tab替换为tabsize个空格,默认是8个 字符串的分割和组合: * S.split([sep, [maxsplit]]) #以sep为分隔符,把S分成一个list。maxsplit表示分割的次数。默认的分割符为空白字符

相关文档
最新文档