python 字符串在一段字符串中如何提取关键的几个数据?

python获取字符串中的特定数据_百度知道
python获取字符串中的特定数据
网页部分代码如下&script type=&text/javascript&&
Page(1, 102, &c&, 2, &&);
&/script&
想通过python获取 102位置的数据(102位置为随机值)想通过这个例缉辅光恍叱喝癸桶含垃子学习下如果解决这类问题,请大哥教教我,谢谢
提问者采纳
这类问题用regex:import rea='&script type=&text/javascript&&\nPage(1, 102, &c&, 2, &&);\n&/script&'s = re.compile('&script type=&text/javascript&&\s+P缉辅光恍叱喝癸桶含垃age\(1, ([^,]+),').search(a)print(s.group(1))group(1)是第一个括号里匹配的内容([^,]+)具体去python主页看regex说明。
提问者评价
你真棒,学习了
其他类似问题
1人觉得有用
python的相关知识
按默认排序
其他1条回答
import res='Page(1, 102, &c&缉辅光恍叱喝癸桶含垃, 2, &&);'outnum = pile(r'Page\(\d+, (\d+),.*\)').findall(s)[0])
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁                      Python中的字符串
  可能大多数人在学习C语言的时候,最先接触的数据类型就是字符串,因为大多教程都是以"Hello world"这个程序作为入门程序,这个程序中要打印的"Hello world"就是字符串。如果你做过自然语言处理方面的研究,并且用Python去做过相关实验,你肯定会体会到Python在字符串处理方面相对于其他语言的明显优势之处。今天我们来了解一下Python中的字符串,看看它的用法。
一.Python中如何声明字符串
  在Python中声明一个字符串通常有三种方法:在它的两边加上那个单引号、双引号或者三引号。
  从上面可以看出三种声明方法的效果是完全一样的,在Python中用这三种声明方法来声明字符串意义完全等同的,即'hello world'和"hello world"以及'''hello world'''是没有任何区别的。但是会有人问:既然是完全等同的,为什么要弄出三种声明方式呢?下面看一下这几个例子:
  在Python中提供了这几种方法,使得使用起来更加方便灵活(当然也可以使用转义字符去解决上面报错的地方)。
  在这里要注意的是,
  1)在Python中没有类似C语言中char这种类型的字符串,也就是说即使是单个字符也是字符串。
  2)Python中的字符串一旦声明,是不能进行更改的,即不能通过对某一位置重新赋值改变内容。
二.Python中的字符串类型
  Python中的字符串有两种数据类型:str类型和unicode类型。str类型采用的ASCII编码,也就是说它无法表示中文。unicode类型采用unicode编码,能够表示任意的字符,包括中文、日文、韩文等。
  在python中字符串默认采用的ASCII编码,如果要显示声明为unicode类型的话,需要在字符串前面加上'u'或者'U'。
  下面看一段代码
print '我'
print u'我'
print 'python'
print u'python'
  这段代码的运行结果为:
  从运行结果可以看出,如果是中文的话,不采用unicode类型,输出的会是乱码。
三.转义字符和原始字符串
  同C语言中一样,Python中也有转义字符,用反斜杠'\'来表示对后面字符进行转义。
  比如上面例子中的问题就可以用转义来解决:
  如果你编写过Java程序,并且使用过Java中的正则表达式,你可能会对Java正则表达式深恶痛绝(我自己就是),因为稍不注意就会出错,里面有太多的转义,而且看起来也很繁琐杂乱。在Python中,你不必再为这个问题烦恼了,因为Python提供了原始字符串,顾名思义,就是保留原始字符的意思,不对反斜杠及反斜杠后面的字符进行转义,声明原始字符串的方法是在字符串前面加上'r'或者'R'。
  在这里要注意:在Python中行尾结束符始终为'\n',不论Python程序在哪个操作系统下运行。在Linux环境下编写C语言时,换行符为'\n',而在windows下为'\r\n'。编写Python程序不用担心这种因运行环境不同引起的不兼容问题。
四.用户输入以及格式化输出字符串
  在Python中最常用的从键盘获取输入的函数是raw_input()和input()。但是这两个函数有很大的区别:
  raw_input()以字符串的形式返回用户输入的一切内容;
  而input()却不是这样,它会根据输入内容的形式确定返回的形式(可能有点拗口)。下面看个例子就明白了:
  从这个例子显而易见可以看出两者的区别,同样输入123,raw_input()返回的是字符串123,而input()返回的是整数123。个人建议一般情况下使用raw_input()获取输入,这样能避免程序中出现一些不必要的麻烦。
  同C语言一样,Python中也提供了格式化输出。
  Python中的格式化输出和C语言类似,基本格式如下:
  print '....%formmat..' %(var...)
  当var只有一个时,括号可以省略。
  关于Python的字符串今天就讨论这么多了,在这里只是讨论了基本的概念和知识点,相关字符串函数的使用请查阅API文档。
阅读(...) 评论()trackbacks-0
基本数据类型:
bool,布尔类型:True,False
数字:如number=8.
二进制:0b或者0B,比如0b11 -& 十进制3
八进制:0o或者0O,比如0o11 -& 十进制9
十六进制:0x或者0X,比如ox11 -& 十进制17
简单的运算符:
+,-,*,/,//(求商),%(取余),**(幂运算) &#没有++,--运算符
位运算符&&,&&,|(按位或),&(按位与)
三元运算符:A=X?Y:Z &(等同于:A=Y if X else Z)
浮点数:如2.5,12.3E-3即0.0123
复数:虚部使用j表示,例 2+3j
相关模块:math,random
bytes,字节:&而一系列不可改变的介于0-255之间的数字被称为bytes对象。每一个byte可以是一个ASCII字符或者十六进制数从\x00到\xff。
不能对bytes对象直接复制,可以将bytes转换为一个bytearray对象,bytearray对象是可以被修改的。如barr = batearray(bytes_object)
bytes对象和string不可以混在一起:
print(by+str) 导致错误:TypeError: can't concat bytes to str
bytes对象有一个decode()方法,向该方法传递一个字符编码参数,该方法会返回使用该种编码解码后的字符串。同样的,string有一个encode()方法,完成反向的工作。
btest = b'abcde'
strtest = 'abc'
btest.decode('utf-8') & &#结果'abcde'
strtest.encode('utf-8') & &#结果b'abc'
btest = b'abcde'
len(btest) & & #结果5
btest += b'f' & &#结果b'abcdef'
btest[0] & #结果97
string,字符串(由一系列不可改变的Unicode字符组成):如strtest='abcde'。(不能使用strtest[0] = 'a'改变字符串的内容)
字符串提取&
print (strtest[0]),输出a
print (strtest[-1]),输出e
范围引用,基本样式[下限:上限:步长]
print (strtest[:3]) & & &#输出abc&
print (strtest[1:-1]) & #输出bcd
print (strtest[::2]) & & #输出ace
print (strtest + strtest) = print (strtest*2),输出abcdeabcde
&字符串包含判断:in, not in
"He" in str
&she& not in str
字符串的方法
S.find(substring, [start [,end]]) #可指范围查找子串,返回索引值,否则返回-1
S.rfind(substring,[start [,end]]) #反向查找
S.index(substring,[start [,end]]) #同find,只是找不到产生ValueError异常
S.rindex(substring,[start [,end]])#同上反向查找
S.count(substring,[start [,end]]) #返回找到子串的个数
S.lowercase()
S.capitalize()&&&&& #首字母大写
S.lower()&&&&&&&&&& #转小写
S.upper()&&&&&&&&&& #转大写
S.swapcase()&&&&&&& #大小写互换
S.split(str, ' ')&& #将string转list,以空格切分
S.join(list, ' ')&& #将list转string,以空格连接
S.format():接受位置参数和关键字参数. 例:"I like {0} and {{rice}}.".format("eggs.") -& "I like eggs and {rice}."
处理字符串的内置函数
len(str)&&&&&&&&&&&&&&& #串长度
cmp("my friend", str)&& #字符串比较。第一个大,返回1
max('abcxyz')&&&&&&&&&& #寻找字符串中最大的字符
min('abcxyz')&&&&&&&&&& #寻找字符串中最小的字符
string的转换
oat(str) #变成浮点数,float("1e-1")& 结果为0.1
int(str)&&&&&&& #变成整型,& int("12")& 结果为12
int(str,base)&& #变成base进制整型数,int("11",2) 结果为2
long(str)&&&&&& #变成长整型,
long(str,base)& #变成base进制长整型,
字符串的格式化(注意其转义字符,大多如C语言的,略)
str_format % (参数列表) ?#参数列表是以tuple的形式定义的,即不可运行中改变
&&&print ("%s's height is %dcm" % ("My brother", 180))
#结果显示为 My brother's height is 180cm
单引号和双引号的字符串的对比:
"Hello, world" 与 'Hello, world'相同
"Let's go!"(正常字符串) 与 'Let's go!'(非正常字符串 -& 使用转义字符修改为正常字符串:'Let\'s go!')
print ('ab\ncd') :输出分别为'ab'和'cd'的两行;而print (r'ab\ncd')直接输出无转移的字符串'ab\ncd'
&complex:虚数
例:8.3+3j
列表 :List,如[1,2,3,4]。
0为第一个元素,-1为最后一个元素(-2为倒数第二)
len(list):取出list的长度
type(variable):显示变量的类型
新建list对象:newlist = list()
切片:mylist[start:end:step],其中 start 和 end 分别是开始和结束索引,step 是在切片时要跨过的条目数量
删除一段数据:L[1:3]=[]
列表的方法
L.append(var):追加元素
L.clear():删除所有元素
L.count(var):该元素在列表中出现的个数
L.extend(list):追加list,即合并list到L上
L.index(var):该元素的位置,无则抛异常&
L.insert(index,var):插入元素
L.pop(var):返回最后一个元素,并从list中删除之
L.remove(var):删除第一次出现的该元素
L.reverse():倒序
L.sort():排序
list 操作符:,+,*,关键字del
a[1:]:片段操作符,用于子list的提取
[1,2]+[3,4] :为[1,2,3,4]。同extend()
[2]*4:为[2,2,2,2]
del L[1]:删除指定下标的元素
del L[1:3]:删除指定下标范围的元素
list的复制:
L1 = L:L1为L的别名,用C来说就是指针地址相同,对L1操作即对L操作。函数参数就是这样传递的
L1 = L[:]:L1为L的克隆,即另一个拷贝。
dict = {'ob1':'computer', 'ob2':'mouse', 'ob3':'printer'}每一个元素是pair,包含key、value两部分。key是Integer或string类型,value 是任意类型。键是唯一的,字典只认最后一个赋的键值。
dictionary的方法
D.clear():清空字典,同del dict
D.copy():拷贝字典
D.fromkeys():
D.get(key, 0):同dict[key],多了个没有则返回缺省值,0。[]没有则抛异常
D.items():
D.keys():返回字典键的列表
D.popitem():得到一个pair,并从字典中删除它。已空则抛异常
D.setdefault():
D.update(dict2):增加合并字典
D.values():
dictionary的复制dict1 = dict:别名dict2=dict.copy():克隆,即另一个拷贝
tuple:元组(即常量数组)
tuple = ('a', 'b', 'c', 'd', 'e')
可以用list的 [],:操作符提取元素。就是不能直接修改元素。
元组的方法:
T.count(val):计算值为val变量的个数
T.index(val,[begin,[end]]):返回第一个值为val的变量编号
list 和 tuple 的相互转化:tuple(ls),list(ls)
基本语句:
&赋值语句:
普通复制:a=1
元组复制:a,b=1,'x' &#a=1, b='x'
列表复制:[a,b]=[1,'x'] &#a=1, b='x'
顺序复制:a,b,c,d='HTML' &#a='H', b='T', c='M', d='L'(只针对单个字符)
多目标复制:a=b=c=d=1 &#a=1,b=1,c=1,d=1
删除变量:var = None 或者&del [variable]
参考文献:
字符集和字符编码:&
阅读(...) 评论()python字符编码惯用法
本文总结在实际应用中遇到的python字符编码问题,制定一套编码相关的约定,避免编码上的错误。
在写猥琐宝典时需要总结soj上做过的题,准备在总结过程中顺便写一个soj上的题解。题解使用python可读,也就是python可以直接eval的格式,以便于处理。写题解老是copy soj上的题目id,title不是太方便,所以就准备自动生成一个空的题解,里面包含了我做过的题。然而直接从soj上只能拿到自己过了的题的id列表,缺乏其它信息。缺乏的信息可以抽象为soj,其中包含了一个以id为主键的表,表中有题目所有的信息。于是代码分为两部分,一部分是soj的工具,其中包含了数据库操作,根据id获取AC的题目列表,另一部分是基于soj工具,负责题解数据的操作。
学python比较晚,当时面临python2和python3的选择,看过一些区别,感觉python3的设计更加合理,而python2比较随意。尤其是字符串部分,python2的概念不清楚,把字节的序列和字符串混在一起,导致一些混乱。首先用python3写的工具,然后想把代码作为web后台,把结果以网页的形式展示出来,这就涉及到python2了,因为在生产环境中还是以python2为主。在转为python2的过程中,不得不重新审视一下字符串的部分,然后总结出这篇文章。
在python2中使用string和unicode string类型,而在python3中则使用bytes和string类型,他们对等:python2.string = python3.bytes, python2.unicode string = python3.string。在python2中,感觉字符串相关东西混乱的原因在于命名失误:以偏概全,用的是string的名表达的是bytes的概念。
bytes的概念:
bytes表达了字节为单位的序列,数据本身的意义很有限,只有当这些数据是按一定规则组织的,进而表达了某个概念,才存在编码问题,数据才有意义。
比如我们可以认为bytes每4字节表示一个32位整数,其中整数每连续8位作为一个字节放在一起,且低位放在前面,这样的bytes就是有编码的,表达了32位整数的概念。
同样的我们也可以认为bytes表示了utf8编码的字符串,每1到6个字节对应一个unicode字符,我们称bytes具有utf8编码,表达了字符串的概念。
string的概念:
如果要表达字符串概念,[Char]才是比较准确的(字符的列表)。至于一个Char占用多少存储,完全不知道。可以是utf16,用2或4字节表示一个Char,也可以是utf32用4字节表达一个Char,还可以是utf8用1到6字节来表示一个Char,这是实现者的事,不应该对我们的使用产生任何影响。
所以,我们需要bytes用来表示string时,需要指定编码,将string转为bytes,对应的函数是encode。当我们认为bytes具有某个字符编码表达的是一个字符串的时候,通过decode并指定该编码得到string。严格地说来在python2中,我们不应该在string对象上调用encode方法,不应该在unicode string对象上调用decode方法。
更进一步,任何抽象都可以encode得到对应的bytes,通过decode得到对应的抽象。
在上述的基础上,引入一些编码约定,目标是避免编码错误。
1.源代码编码,这个编码通过#coding:xxx指出,在python2和python3中概念都很明确。
惯用法(约定):
源代码只使用utf8编码。
2.string literal的类型和编码:
python2中一个形如"xxxx"的string literal具有string类型,编码和源代码编码一致。
而形如u"xxxx"的string literal具有unicode string类型,存在一个自动的源代码编码向unicode string decode的过程。无法转换时会报错,这个时候需要查通过注释指出的编码以及源代码的真实编码。
python3中一个形如"xxxx"的string literal具有string类型,此时,存在自动的源代码编码向unicode的decode过程。
而b"xxxx"的string literal具有bytes类型,表示了源代码的一部分。所以,当其中内容是字符串时,我们也称之是一个和源代码编码一致的字符串。
python2中用string来表达字符串的概念,并使用utf8编码。而python2中unicode string和string混用时,string被认为具有源代码编码,并decode为unicode string。于是存在陷阱,使用的变量的类型失去控制,不知道是string还是unicode string,所以在这里要特别注意。如果用string表达字符串的概念,同时用其它编码,也是可以的,主要是看编码对应的字符集和应用是不是能很好结合在一起。
而python3则string来表达字符串的概念,不关心编码问题。python3不存在混用问题,bytes和string一结合使用,就会报错。
3.urlopen(xxx).read()后的处理:
很明确,这里返回的概念是python3.bytes。
如果确定返回的东西是一个网页的文本,我们可以调用decode(encoding='网页编码', errors='ignore')来得到对应的字符串。
但是,注意2中python2的约定,我们的字符串的类型是python2.string的,所以在python2中我们还要有一个encode的过程:encode(encoding='源代码编码', errors='ignore')
4.写数据文件:
在这里写的是一个特殊的文件,文件可以被看成是一段python代码并执行,所以:
文件编码使用utf8。
在python2中
with open(file, 'wb') as tempf:
tempf.write(data)
with open(file, 'w') as tempf:
tempf.write(data)
都是可以的,因为string无法区别是字节还是字符串。
而在python3中则要使用:
with open(file, 'wb') as tempf:
tempf.write(data.encode(encoding='utf8',errors='ignore'))
with open(file, 'w') as tempf:
tempf.write(data)
因为前者写入的是bytes而后者是string。
上述可行性是建立在我们约定数据文件和源代码编码都是utf8的情况下得到的,如果没有这些约定,我们看看这些代码的语义:
python2中两份代码语义有点乱:
如果已知data是一个字符串,那么第一份代码理论上错误,但是实际上两份代码都完成了把data写到文件,数据文件编码和data一致的目标。
如果已知data是一个二进制流,那么第二份代码理论上错误,但是实际上两份代码也都完成任务,数据文件不存在编码问题。
python3中第一份代码的语义是,写入data这个字符串,数据文件编码是utf8。
而第二份代码语义是:写入data这个字符串,数据文件编码和当前源文件编码(在这是认为默认编码等于当前源文件编码)一致。
5.读数据文件:
在python2中
with open(file, 'rb') as tempf:
tempf.read()
with open(file, 'r') as tempf:
tempf.read()
均可,因为前者返回一些字节,但是用的是string作容器。而后者返回的还是string。
而在python3中则要用:
with open(file, 'rb') as tempf:
tempf.read().decode(encoding='utf8',errors='ignore')
with open(file, 'r') as tempf:
tempf.read()
因为打开的模式不同,前者返回了bytes,后者返回的是string(在内部尝试bytes尝试用源文件encoding解码)。
同样的这些代码的可行性也是建立在若干约定的基础上,如果没有这些约定,也来看看其语义:
python2中第一份代码的语义是读回一些二进制数据。
python2中第二份代码的语义是读入一些字符串。(理论上会有一个先读二进制再根据当前默认编码decode然后再向当前默认编码encode的过程,但是在这里认为两个变换是恒等的,所以没动作。显然,在出现非法字符的情况下,两个变换不恒等。)
python3中第一份代码的语义是读入二进制数据,根据utf8进行decode。
python3中第二份代码的语义是隐式地读入二进制数据,根据当前默认编码进行decode。
在我的应用场景里,读回的数据还有个eval的过程。显然,python2直到eval才可能出现编码错误,而python3能更早发现错误。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。

我要回帖

更多关于 python 字符串比较 的文章

 

随机推荐