python字符串替换的2种方法

python 字符串替换 是python 操作字符串的时候经常会碰到的问题,这里简单介绍下字符串替换方法。
python 字符串替换可以用2种方法实现:
1是用字符串本身的方法。
2用正则来替换字符串

下面用个例子来实验下:
a = 'hello word'
把a字符串里的word替换为python


1用字符串本身的replace方法

a.replace('word','python')

输出的结果是hello python

2用正则表达式来完成替换:

import re
strinfo = re.compile('word')
b = strinfo.sub('python',a)
print b

输出的结果也是hello python

至于用哪个方法的话,看你自己的选择了。

Posted by redswallow Mon, 02 Aug 2010 22:15:29 +0800


python去除空格/回车符/换行符

print 的最后加个逗号:

for j in range(0,len(list)):
    print list[j],

 

或者把line先strip()一下:

 

s=某字符串
print "".join(s.split())

for j in range(0,len(list)):
    print "".join(list[j].split())

 

Posted by redswallow Mon, 02 Aug 2010 21:20:48 +0800


python用time函数计算程序运行时间

内置模块time包含很多与时间相关函数。我们可通过它获得当前的时间和格式化时间输出。

time(),以浮点形式返回自Linux新世纪以来经过的秒数。在linux中,00:00:00 UTC, January 1, 1970是新**49**的开始。

 

import time

start = time.clock()

#当中是你的程序

elapsed = (time.clock() - start)
print("Time used:",elapsed)

Posted by redswallow Sun, 18 Jul 2010 00:56:21 +0800


python模块之 HTMLParser: 解析html,获取url

HTMLParser是python用来解析html的模块。它可以分析出html里面的标签、数据等等,是一种处理html的简便途径。 HTMLParser采用的是一种事件驱动的模式,当HTMLParser找到一个特定的标记时,它会去调用一个用户定义的函数,以此来通知程序处理。它 主要的用户回调函数的命名都是以handler_开头的,都是HTMLParser的成员函数。当我们使用时,就从HTMLParser派生出新的类,然 后重新定义这几个以handler_开头的函数即可。这几个函数包括:


handle_startendtag  处理开始标签和结束标签
handle_starttag     处理开始标签,比如<xx>
handle_endtag       处理结束标签,比如</xx>
handle_charref      处理特殊字符串,就是以&#开头的,一般是内码表示的字符
handle_entityref    处理一些特殊字符,以&开头的,比如 &nbsp;
handle_data         处理数据,就是<xx>data</xx>中间的那些数据
handle_comment      处理注释
handle_decl         处理<!开头的,比如<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
handle_pi           处理形如<?instruction>的东西

 

本文主要简单讲一下HTMLParser的用法.

使用时需要定义一个从类HTMLParser继承的类,重定义函数:

  • handle_starttag( tag, attrs)
  • handle_startendtag( tag, attrs)
  • handle_endtag( tag)

来实现自己需要的功能。

tag是的html标签,attrs是 (属性,值)元组(tuple)的列表(list).
HTMLParser自动将tag和attrs都转为小写。

下面给出的例子抽取了html中的所有链接:

from HTMLParser import HTMLParser
 
class MyHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.links = []
 
    def handle_starttag(self, tag, attrs):
        #print "Encountered the beginning of a %s tag" % tag
        if tag == "a":
            if len(attrs) == 0: pass
            else:
                for (variable, value)  in attrs:
                    if variable == "href":
                        self.links.append(value)
 
if __name__ == "__main__":
    html_code = """
<a href="
www.google.com"> google.com</a>
<A Href="
www.pythonclub.org"> PythonClub </a>
<A HREF = "
www.sina.com.cn"> Sina </a>
"
"" hp = MyHTMLParser() hp.feed(html_code) hp.close() print(hp.links)

输出为:

['www.google.com', 'www.pythonclub.org', 'www.sina.com.cn']

如果想抽取图形链接

<img src='http://www.google.com/intl/zh-CN_ALL/images/logo.gif' />

就要重定义 handle_startendtag( tag, attrs) 函数

Posted by redswallow Sun, 18 Jul 2010 00:29:51 +0800


Python初始化多维数组

Python中初始化一个5 x 3每项为0的数组,最好方法是:

multilist = [[0 for col in range(5)] for row in range(3)]

我们知道,为了初始化一个一维数组,我们可以这样做:


alist = [0] * 5

没错,那我们初始化一个二维数组时,是否可以这样做呢:


multi = [[0] * 5* 3

其实,这样做是不对的,因为[0] * 5是一个一维数组的对象,* 3的话只是把对象的引用复制了3次,比如,我修改multi[0][0]:


multi = [[0] * 5* 3
multi[0][0] 
= 'Love China'
print multi

输出的结果将是:


[['Love China', 0, 0, 0, 0], ['Love China', 0, 0, 0, 0], ['Love China', 0, 0, 0, 0]]


我们修改了multi[0][0],却把我们的multi[1][0],multi[2][0]也修改了。这不是我们想要的结果。



如果我们这样写呢:


multilist = [[0] * 5 for row in range(3)]
multilist[0][0] 
= 'Love China'
print multilist

我们看输出结果:


[['Love China', 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]


恩,没问题。但是,由于使用 * 的方法比较容易引起混淆导致Bug,所以还是推荐使用上面第一种方法,即:


multilist = [[0 for col in range(5)] for row in range(3)]

 

Posted by redswallow Sat, 10 Jul 2010 04:07:52 +0800


const char*和char const*以及char*const

const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。

事 实上这个概念谁都有,只是三种声明方式非常相似很容易记混。
Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:
把一个声明从右向左读。

char * const cp; ( * 读成 pointer to )
cp is a const pointer to char

const char * p;
p is a pointer to const char;

char const * p;
同上因为C++里面没有const*的运算符, 所以const只能属于前面的类型。


C++标准规定,const关键字放在类型或变量名之前等价的。

 

const int n=5;    //same as below
int const m=10;

 

const int *p;    //same as below  const (int) * p
int const *q;    // (int) const *p

 

char ** p1; 
//    pointer to    pointer to    char 
const char **p2;
//    pointer to    pointer to const char 
char * const * p3;
//    pointer to const pointer to    char 
const char * const * p4;
//    pointer to const pointer to const char 
char ** const p5;
// const pointer to    pointer to    char 
const char ** const p6;
// const pointer to    pointer to const char 
char * const * const p7;
// const pointer to const pointer to    char 
const char * const * const p8;
// const pointer to const pointer to const char

 

说到这里,我们可以看一道以前Google的笔试题:

[题目]const char *p="hello";
       foo(&p);//函数foo(const char **pp)
下面说法正确的是[]
A.函数foo()不能改变p指向的字符串内容
B.函数foo()不能使指针p指向malloc 生成的地址
C.函数foo()可以使p指向新的字符串常量
D.函数foo()可以把p赋值为 NULL.

至于这道题的答案是众说纷纭。针对上面这道题,我们可以用下面的程序测试:

 

#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>


void foo(const char **pp)
{
//    *pp=NULL;
//    *pp="Hello world!";
        *pp = (char *) malloc(10);
        snprintf(*pp, 10, "hi google!");
//       (*pp)[1] = 'x';

}

int
main()
{
    const char *p="hello";
    printf("before foo %s\n",p);
    foo(&p);
    printf("after foo %s\n",p);
    p[1] = 'x';

    return;
}



结论如下:

  1. 在foo函数中,可以使main函数中p指向的新的字符串常量。
  2. 在foo函数中,可以使main函数中的p指向 NULL。
  3. 在foo函数中,可以使main函数中的p指向由malloc生成的内存块,并可以在main中用free释放,但是会有 警告。但是注意,即使在foo中让p指向了由malloc生成的内存块,但是仍旧不能用p[1]='x';这样的语句改变p指向的内容。
  4. 在 foo中,不能用(*pp)[1]='x';这样的语句改变p的内容。

      所以,感觉gcc只是根据const的字面的意思对其作了限制,即对于const char*p这样的指针,不管后来p实际指向malloc的内存或者常量的内存,均不能用p[1]='x'这样的语句改变其内容。但是很奇怪,在foo里 面,对p指向malloc的内存后,可以用snprintf之类的函数修改其内容

 

Posted by redswallow Fri, 09 Jul 2010 15:12:22 +0800


给Python IDLE加上自动补全和历史功能

许多时候,我们使用Python,并不用写一个程序,一些不复杂的任务,我更喜欢在 IDLE(也就是交互式提示模式)下输入几行代码完成。然而,在这个模式下编辑代码,也有不够便利的地方,最主要的就是,不能用Tab自动补全,不能记忆 上一次输入的命令(没办法,谁让我们在Shell下习惯了呢)。
这时候,我们可以直接使用Python启动脚本,解决这个问题。

启动脚本的程序非常简单,这里不多说明,只给出代码:

import readline
import rlcompleter
import atexit
import os
# tab autocomplete
readline.parse_and_bind(‘tab: complete’)
# history file
histfile = os.path.join(os.environ['HOME'], ‘.pythonhistory’)
try:
readline.read_history_file(histfile)
except IOError:
pass
atexit.register(readline.write_history_file, histfile)
del os, histfile, readline, rlcompleter

 完成之后,我们把它保存为.pythonstartup,存放在自己的目录下(譬如/home/yurii),再将PYTHONSTARTUP变量指向刚才放的地址,就可以了。最省事的办法是在bashrc中添加这样一行: 

export PYTHONSTARTUP=/home/yurii/.pythonstartup

 这样,不但增加了tab的自动补全功能,而且重新启动IDLE时,通过上下键,还能翻到上次输入的命令,非常方便。

 

Posted by redswallow Sun, 23 May 2010 22:03:41 +0800


5.23计划

1. Python刷Project Euler

2. baidu astar坦克ai

3. c++刷poj

4. 装ubuntu 10.04

Posted by redswallow Sun, 23 May 2010 21:59:04 +0800


VimIM: 基于Vim的中文输入法

从这里发现的: http://viktor.is-programmer.com/posts/8407.html

Vim 的命令、插入模式设计极大的简化了命令的按键,但是也带来一个问题,相信用过 Vim 的同学都有这个体会,那就是输入中文的时候有些不便。

因为命令模式只接受纯英文的输入,所以在插入模式下输入完中文,如果想要输入处理命令,那么除了 Esc 切换回命令模式之外,还得把输入法切换成英文状态才行。如果处理之后还要继续输入中文,还得再把输入法切换回来。

lyanry 同学曾经想出一个解决办法,解决了转换到命令模式时的麻烦,不过返回插入模式,还是要再打开输入法。

现在 VimIM 出现,这些问题得到了完美的解决。

VimIM 是一个专门为 Vim 玩家开发的嵌入式输入法,只要你的 Vim 可以显示中文,就可以用 VimIM。

VimIM 的 特点:

  • 【独立】 Plug & Play  不折腾   Open Source  不差钱
  • 【自主】 整个 Vim 连同 VimIM 中文输入法可装入优盘随身携带
  • 【自力】 VimIM 点石成金     VimIM 中文搜索
  • 【更生】 VimIM 中文输入模式   双码输入【山寨版】
  • 【高性能】个性 智能 自然 流畅
  • 【低能耗】小巧 玲珑 无捆绑 无干扰
  • 【和谐☆绿色】 No secret hidden glitch; No strings attached.
  • 【自由☆免费】 Free as in freedom, as well as in free beer!

废话不说,先看看怎么安装吧:

  1. 确认您的 Vim 能显示中文: 【科普】如何让Vim支持中文?
  2. 首先去 VimIM 官方网址 下载新版脚本
  3. 再到 VimIM 码表样例 中,抓一个您喜欢的中文输入法码表
  4. 然后把 vimim.vim 和您的码表扔到 Vim 的 plugin 目录下

安装之后打开 Vim,就可以耍耍了~

两个最基本且激动人心的功能:

1. 点石成金

在插入模式下,直接输入中文的拼音,如果想要转换成中文,只需要按 Crtl + \

比如直接在插入模式下输入 women:

然后按 Ctrl + \,就会出现:

很方便吧~

2.中文输入模式

插入模式下按 Ctrl + 6,就进入了中文的连续输入模式,这样就和普通的输入法一样,来输入中文了。

在连续模中文模式下,和普通的输入法也一样,空格上中文,回车上英文。

要想切换回命令模式,只要 Esc 一下,再返回插入模式,还是中文输入状态~

嗯嗯,这只是最基本的两个功能,更多的功能和设置,可以参见:

http://maxiangjiang.googlepages.com/vimim.html#id19

除此之外,你还可以直接编辑码表,来改变词库,码表的格式,异常的简单

VimIM 的:

官方网址: http://vim.sourceforge.net/scripts/script.php?script_id=2506
新闻论坛: http://groups.google.com/group/vimim
最新主页: http://maxiangjiang.googlepages.com/vimim.html

Posted by redswallow Sun, 23 May 2010 21:38:02 +0800


Magnet链接

Magnet链接,主要用于识别能够通过点对点技术下载的文件。这种链接是基于文件内容来识别文件,而不是基于文件的位置或者名称的。更确切地说,它是通过文件的散列函数来识别的。

既然Magnet链接是基于文件内容或者元数据而不是位置的,Magnet链接可以被认为是一种统一资源定位,而不是更常见的统一资源定位。尽管Magnet链接可以被其他应用程序使用,但是它的主要用途还是在点对点技术方面,因为其可以定位不在稳定主机上的资源。

 

Magnet链接最常见的用途是基于文件内容的散列函数来链接到特定文件,生成一个唯一的文件识别符, 类似于 ISBN。不像常规的识别符,内容散列可以被任意一位持有此文件的人生成,所以并不需要一个中心机构,这使其在文件共享领域经常被用作搜索条件,因任何人都可以分发一个Magnet链接来确保该链接指向的资源就是他想要的,而和得到该资源的方式无关。(虽然技术上讲,两个不同的文件可能具有相同的散列值,但实际上这是极不可能发生的)

另一个Magnet链接的优势是开放性和跨平台性: 一个Magnet链接可被运行在几乎所有平台上的应用程序们使用以下载一个文件。因为Magnet链接十分简洁且为纯文本格式,所以用户可以很方便地将其复制到电子邮件或即时消息中,比如,BitTorrent种子。


Magnet链接由一组参数组成,参数间的顺序没有讲究,其格式与在HTTP链接末尾的查询字符串相同。最常见的参数是 "xt" ,是 "exact topic" 的缩写,通常是一个特定文件的内容散列函数形成的 URN,例如:

Magnet-icon.gif magnet:?xt=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C

其值是Base32编码的文件的SHA-1散列。

注意,虽然这个链接指向一个特定文件,但是客户端应用程序仍然必须进行搜索来确定哪里,如果有,能够获取那个文件。

在标准的草稿中其他参数的定义如下:

  • "dn" ("显示名称"): 为了方便,为用户显示文件名称
  • "kt" ("关键字"): 更笼统的搜索,指定搜索关键字而不是特定文件
  • "mt" ("文件列表"): 一个 URI 指向一个列表,例如一个项目列表
  • 应用程序定义的实验参数,必须以 "x." 开头

标准还建议同类的多个参数可以在参数名称后面加上 ".1", ".2" 等来使用,例如

Magnet-icon.gif magnet:?xt.1=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C&xt.2=urn:sha1:TXGCZQTH26NL6OUQAJJPFALHG2LTGBC7

Posted by redswallow Sun, 23 May 2010 21:29:09 +0800