Chinaunix

标题: 替换处理 [打印本页]

作者: napleon    时间: 2009-02-26 22:06
标题: 替换处理
如果有一大堆这样的数据想用python写过程序处理一下,刚开始学python不太会。

<book id="1" fullname="/home/napleon/AF_xxx.so" name="yyy"></book>
每一行的id数值都不一样,每一行的yyy也不一样。但是xxx可能一样,因为有很多个都在一个AF_xxx.so中。
我需要用yyy替代掉xxx,因为我现在每一个so只包括一个yyy的文件。请问该怎么写。
作者: zhenglxd    时间: 2009-02-26 22:39
你到底在表达什么啊???
作者: xiaoyu9805119    时间: 2009-02-27 09:19
>>> import re

>>> s = '<book id="1" fullname="/home/napleon/AF_xxx.so" name="yyy"></book>'

>>> print re.sub('fullname="/home/napleon/AF_(.*).so" name="(.*)">',r'fullname="/home/napleon/AF_\2.so" name="\2">',s)

<book id="1" fullname="/home/napleon/AF_yyy.so" name="yyy"></book>

不知道楼主是不是想要这种效果
作者: zhenglxd    时间: 2009-02-27 10:09
标题: 回复 #3 xiaoyu9805119 的帖子
又偷学到了一招 \的用法  这个你从哪里学的啊 我看了其他教材都没介绍的
作者: xiaoyu9805119    时间: 2009-02-27 10:10
原帖由 zhenglxd 于 2009-2-27 10:09 发表
又偷学到了一招 \的用法  这个你从哪里学的啊 我看了其他教材都没介绍的

恩,很少有提到这个用法的。其实也就是类似perl里匹配后的$1,$2的效果

作者: zhenglxd    时间: 2009-02-27 10:23
标题: 回复 #5 xiaoyu9805119 的帖子
  我看教材上有re.compile
这个东东什么用啊 加和不加 除了速度上的差异 和re.compile可以加修饰符外
与什么大的区别吗  还有像 r.match 和re.match r.search和re.search是一个东东吗  我昨天去你的blog看过了 又学了一招 [::-1]太酷了
作者: xiaoyu9805119    时间: 2009-02-27 10:28
标题: 回复 #6 zhenglxd 的帖子
>>> print re.sub("(.*) (.*)", r"\2 \1", "hello smallfish")
smallfish hello
调换匹配的

>>> print re.sub("(.*) (.*)", r"hi \2", "hello smallfish")
hi smallfish
直接修改的

看到了把,是不是很有意思?
作者: zhenglxd    时间: 2009-02-27 10:51
标题: 回复 #7 xiaoyu9805119 的帖子
这个我看的懂啦 你偷偷在(.*)(.*)中间加了个 空格
不过
print re.sub("(.*)(.*)", r"\2 \1", "hello smallfish")
没有空格你试下
这个想不明白
作者: xiaoyu9805119    时间: 2009-02-27 11:06
原帖由 zhenglxd 于 2009-2-27 10:51 发表
这个我看的懂啦 你偷偷在(.*)(.*)中间加了个 空格
不过
print re.sub("(.*)(.*)", r"\2 \1", "hello smallfish")
没有空格你试下
这个想不明白

>>> print re.sub("(.*)(.*)", r"\2", "hello smallfish")

>>> print re.sub("(.*)(.*)", r"\1", "hello smallfish")
hello smallfish

看明白了么。第一个(.*)匹配了整个字符串.号可以匹配任何单个字符,这个是正则方面的定义哦,具体还要看那方面的资料了
作者: zhenglxd    时间: 2009-02-27 11:44
标题: 回复 #9 xiaoyu9805119 的帖子
>>> print re.sub("(.)(.)", r"\2", "hello smallfish")
el mlfsh
>>> print re.sub("(.) (.)", r"\2", "hello smallfish")
hellsmallfish
这2个怎么解释啊
(.)可以便是任何非换行的东西 h e l l o都可以分别表示怎么没被替换掉
作者: Lonki    时间: 2009-02-27 12:44
.* 默认是贪婪匹配, 非贪婪匹配(最小化匹配)用.*?

PS. 建议看看perl5的regular expression资料
作者: napleon    时间: 2009-02-27 23:25
原帖由 xiaoyu9805119 于 2009-2-27 09:19 发表
>>> import re

>>> s = ''

>>> print re.sub('fullname="/home/napleon/AF_(.*).so" name="(.*)">',r'fullname="/home/napleon/AF_\2.so" name="\2">',s)



不知道楼主是不是想要这种效果


正是!谢谢赐教。python真是好东西,刚买回两本大布头,还没开始看。
作者: nhkdxx0    时间: 2009-03-01 20:10
学习了

正在进行一个开源项目:http://www.secservice.net/bbs/viewtopic.php?f=19&t=20

[ 本帖最后由 nhkdxx0 于 2009-4-18 20:11 编辑 ]
作者: linjize123    时间: 2009-03-08 19:46
原帖由 xiaoyu9805119 于 2009-2-27 10:28 发表
>>> print re.sub("(.*) (.*)", r"\2 \1", "hello smallfish"
smallfish hello
调换匹配的

>>> print re.sub("(.*) (.*)", r"hi \2", "hello smallfish"
hi smallfish
直接修改的

看到了把,是不是 ...

<book id="1" fullname="/home/napleon/AF_yyy.so" name="yyy"></book>
>>> print re.sub("(.*)(.*)",r"\2\1","hello smallfish"
hello smallfish
>>> print re.sub("(.*)(.*)",r"hi\1","hello smallfish"
hihello smallfish
>>> print re.sub("(.*)(.*)",r"\1\2","hello smallfish"
hello smallfish
>>> print re.sub("(.*)(.*)",r"\2\1","hello smallfish"
hello smallfish

为什么我的换不了?
作者: linjize123    时间: 2009-03-08 19:52
知道怎么回事了  呵呵
作者: Levin_1221    时间: 2009-03-08 23:57
原帖由 zhenglxd 于 2009-2-27 11:44 发表
>>> print re.sub("(.)(.)", r"\2", "hello smallfish")
el mlfsh
>>> print re.sub("(.) (.)", r"\2", "hello smallfish")
hellsmallfish
这2个怎么解释啊
(.)可以便是任何非换行的东西 h e l l o都可以 ...


sub用的是findall的方式,不是match或search。所以实际上匹配的结果是
he \2 = e
ll    \2 = l
o空格    \2 = 空格
sm   \2 = m
al   \2 = l
lf   \2 = f
is  \2 =s
所以sub的结果是el mlsh
作者: 雨夜流星    时间: 2009-03-17 10:59
标题: 回复 #1 napleon 的帖子
HOHO,看来是我想多了,
第一眼看到LZ贴的东东就想到python的xml模块
看了回帖的才明白,其实可以用字符替换呢




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2