14 08年4月

python非贪婪、多行匹配正则表达式例子

关键字:,

一些regular的tips:

1 非贪婪flag

>>> re.findall(r"a(\d+?)", "a23b")
        
['2']
>>>
re.findall(r"a(\d+)", "a23b")
        
['23']

注意比较这种情况:

>>> re.findall(r"a(\d+)b", "a23b")
        
['23']
>>>
re.findall(r"a(\d+?)b", "a23b")
        
['23']

2 如果你要多行匹配,那么加上re.S和re.M标志
re.S:.将会匹配换行符,默认.不会匹配换行符

>>> re.findall(r"a(\d+)b.+a(\d+)b", "a23b\na34b")
        
[]
>>>
re.findall(r"a(\d+)b.+a(\d+)b", "a23b\na34b", re.S)
        
[('23', '34')]
>>>

re.M:^$标志将会匹配每一行,默认^和$只会匹配第一行

>>> re.findall(r"^a(\d+)b", "a23b\na34b")
        
['23']
>>>
re.findall(r"^a(\d+)b", "a23b\na34b", re.M)
        
['23', '34']

但是,如果没有^标志,

>>> re.findall(r"a(\d+)b", "a23b\na23b")
        
['23', '23']

可见,是无需re.M

贝贝爸 发表在 技术文章 | 等您写评论

13 08年4月

oracle pl/sql身份证15位转15位的function

关键字:, ,

工作中经常遇到身份证要从15位转换到18位的数据,朋友给了一个这样的oracle,pl/sql的函数。测试过,没问题贴出来,备用。

create or replace function f_15to18(idCardNum varchar2) return varchar2 is
 
Result varchar2(20);
i smallint;
num smallint:=0;
sNum varchar2(2);
code char(1);
temp17 varchar2(20);
begin
 
 
if length(idCardNum)=18 or idCardNum is null then
  
Result:=upper(idCardNum);
 
elsif length(idCardNum)=15 then
 
temp17:=substr(idCardNum,1,6) || '19' || substr(idCardNum,7,9);
 
i:=18;
 
 
 
while i>1 loop
 
num:=num+mod(power(2,i-1),11)*substr(temp17,19-i,1) ;
 
i:=i-1;
 
end loop;
 
 
num:=mod(num,11);
 
 
sNum:=num || '';
 
if num=0 then
    
code:='1';
    
elsif num=1 then
    
code:='0';
    
elsif num=2 then
    
code:='X';
    
else
    
code:=(12-num) || '';
 
end if;
    
Result:=temp17 || code;
 
else
    
Result:= idCardNum;
 
end if;
 
return Result;
 
exception
 
when others then
 
dbms_output.put_line(idCardNum);
 
end f_15to18;
/

贝贝爸 发表在 技术文章 | 等您写评论

9 08年4月

python正则表达式学习

关键字:,

出处
python 中的re 模块

正则表达式

就个人而言,主要用它来做一些复杂字符串分析,提取想要的信息
学习原则:够用就行,需要的时候在深入

现总结如下:

正则表达式中特殊的符号:

“.” 表任意字符
“^ ” 表string起始
“$” 表string 结束
“*” “+” “?” 跟在字符后面表示,0个——多个, 1个——多个, 0个或者1个
*?, +?, ?? 符合条件的情况下,匹配的尽可能少//限制*,+,?匹配的贪婪性
{m} 匹配此前的字符,重复m次
{m,n} m到n次,m,n可以省略

举个例子 ‘a.*b’ 表示a开始,b结束的任意字符串
a{5} 匹配连续5个a

[] 表一系列字符 [abcd] 表a,b,c,d [^a] 表示非a
| A|B 表示A或者B , AB为任意的正则表达式 另外|是非贪婪的如果A匹配,则不找B
(…) 这个括号的作用要结合实例才能理解, 用于提取信息

\d [0-9]
\D 非 \d
\s 表示空字符
\S 非空字符
\w [a-zA-Z0-9_]
\W 非 \w

一:re的几个函数

1: compile(pattern, [flags])
根据正则表达式字符串 pattern 和可选的flags 生成正则表达式 对象

生成正则表达式 对象(见二)

其中flags有下面的定义:
I 表示大小写忽略
L 使一些特殊字符集,依赖于当前环境
M 多行模式 使 ^ $ 匹配除了string开始结束外,还匹配一行的开始和结束
S “.“ 匹配包括‘\n’在内的任意字符,否则 . 不包括‘\n’
U Make \w, \W, \b, \B, \d, \D, \s and \S dependent on the Unicode character properties database
X 这个主要是表示,为了写正则表达式,更可毒,会忽略一些空格和#后面的注释

其中S比较常用,
应用形式如下
import re
re.compile(……,re.S)

2: match(pattern,string,[,flags])
让string匹配,pattern,后面分flag同compile的参数一样
返回MatchObject 对象(见三)

3: split( pattern, string[, maxsplit = 0])
用pattern 把string 分开
>>> re.split(’\W+’, ‘Words, words, words.’)
[’Words’, ‘words’, ‘words’, ”]
括号‘()’在pattern内有特殊作用,请查手册

4:findall( pattern, string[, flags])
比较常用,
从string内查找不重叠的符合pattern的表达式,然后返回list列表

5:sub( pattern, repl, string[, count])
repl可以时候字符串,也可以式函数
当repl是字符串的时候,
就是把string 内符合pattern的子串,用repl替换了

当repl是函数的时候,对每一个在string内的,不重叠的,匹配pattern
的子串,调用repl(substring),然后用返回值替换substring

>>> re.sub(r’def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):’,
… r’static PyObject*\npy_\1(void)\n{’,
… ‘def myfunc():’)
’static PyObject*\npy_myfunc(void)\n{’

>>> def dashrepl(matchobj):
… if matchobj.group(0) == ‘-’: return ‘ ‘
… else: return ‘-’
>>> re.sub(’-{1,2}’, dashrepl, ‘pro—-gram-files’)
‘pro–gram files’

二:正则表达式对象 (Regular Expression Objects )

产生方式:通过 re.compile(pattern,[flags])回

match( string[, pos[, endpos]]) ;返回string[pos,endpos]匹配
pattern的MatchObject(见三)

split( string[, maxsplit = 0])
findall( string[, pos[, endpos]])
sub( repl, string[, count = 0])
这几个函数和re模块内的相同,只不过是调用形式有点差别

re.几个函数和 正则表达式对象的几个函数,功能相同,但同一程序如果
多次用的这些函数功能,正则表达式对象的几个函数效率高些

三:matchobject

通过 re.match(……) 和 re.compile(……).match返回

该对象有如下方法和属性:

方法:
group( [group1, …])
groups( [default])
groupdict( [default])
start( [group])
end( [group])

说明这几个函数的最好方法,就是举个例子

matchObj = re.compile(r”(?P\d+)\.(\d*)”)
m = matchObj.match(’3.14sss’)
#m = re.match(r”(?P\d+)\.(\d*)”, ‘3.14sss’)

print m.group()
print m.group(0)
print m.group(1)
print m.group(2)
print m.group(1,2)

print m.group(0,1,2)
print m.groups()
print m.groupdict()

print m.start(2)
print m.string

输出如下:
3.14
3.14
3
14
(’3′, ‘14′)
(’3.14′, ‘3′, ‘14′)
(’3′, ‘14′)
{’int’: ‘3′}
2
3.14sss

所以group() 和group(0)返回,匹配的整个表达式的字符串
另外group(i) 就是正则表达式中用第i个“()” 括起来的匹配内容
(’3.14′, ‘3′, ‘14′)最能说明问题了。

更进一步的学习,请看手册

贝贝爸 发表在 技术文章 | 等您写评论

8 08年4月

python中关于文件路径的简单操作

关键字:

出处
python中关于文件路径的简单操作

几个主要的函数:

1: os.listdir(path) //path为目录

功能相当于在path目录下执行dir命令,返回为list类型
举例:
print os.listdir(’..’)
输出:
[a,b,c,d]

2: os.path.walk(path,visit,arg)

path :是将要遍历的目录
visit :是一个函数指针,函数圆形为:
callback(arg,dir,fileList)
其中arg为为传给walk的arg , dir是path下的一个目录,fileList为dir下的文件和目录组成的list
arg:传给visit用的,对walk没有什么作用

举例:
def callback(arg,directory, files):
print directory,
print files,
print arg
print ‘——————–’

os.path.walk(’.',callback, ‘123456′)

输出:
. [’path0704.py’, ‘temp’, ‘\xc2\xb7\xbe\xb6\xcf\xe0\xb9\xd8\xd1\xa7\xcf\xb0.txt’] 123456
——————–
.\temp [’temp.h’, ‘temp1′] 123456
——————–
.\temp\temp1 [’abc.bmp’] 123456

如果想找到某个目录下所有文件,只需要在callback里面,在fileList中找出文件,即可

除此之外,还有一个函数可以用那就是os.walk,看10

3:os.path.split(path)
path 为一个路径,

输出,把path分成两部分,具体看实例:
print os.path.split(”abc/de.txt”)
(’abc’, ‘de.txt’)
os.path.split(”abc”)
(”, ‘abc’)
print os.path.split(”de/abc/de”)
(’de/abc’, ‘de’)

4: os.path.splitext(filename)
把文件名分成文件名称和扩展名
os.path.splitext(abc/abcd.txt)
(’abc/abcd’, ‘.txt’)

5: os.path.dirname(path)
把目录名提出来
print os.path.dirname(”abc”)
#输出为空
print os.path.dirname(’abc\def’)
abc

6: os.path.basename(filename)
取得主文件名
print os.path.basename(’abc’)
abc
print os.path.basename(’abc.txt’)
abc
print os.path.basename(’bcd/abc’)
abc #这个需要注意不包括目录名称
print os.path.basename(’.')
.

7:os.mkdir(path, [mode])
path为目录名: 这里有个要求,只能创建一级目录
比如path为 abc/def 则当前目录下必须存在abc 否则失败

8: os.makedirs(path [,mode])
可以创建多级目录

9:os.remove(path)删除一个文件,一定是一个文件
os.removedirs(path) 删除一个目录下所有东西
os.rmdir(path) 删除一个目录,而且一定要空,否则os.errer

10:os.walk(path)
遍历path,返回一个对象,他的每个部分都是一个三元组
(’目录x’,[目录x下的目录list],目录x下面的文件)

举例:
a = os.walk(’.')
for i in a:
print i
输出:
(’.', [’abc’, ‘temp’], [’path0704.py’, ‘\xc2\xb7\xbe\xb6\xcf\xe0\xb9\xd8\xd1\xa7\xcf\xb0.txt’])
(’.\\abc’, [], [’\xd0\xc2\xbd\xa8 BMP \xcd\xbc\xcf\xf1.bmp’])
(’.\\temp’, [’temp1′], [’temp.h’])
(’.\\temp\\temp1′, [], [’abc.bmp’])

11:shutil.copy(src,dst)
把文件src内容拷贝到文件dst中。,目标区域必须可以写,如果dst存在,则dst被覆盖

上面的函数基本够用
其它文件移动操作还请看:shutil模块:High-level file operations

贝贝爸 发表在 技术文章 | 等您写评论

2 08年4月

如何把pps文件转换成ppt文件

关键字:

同事有需求,要将pps文件转化成ppt文件,用里面的图片。
google了一把,刚看还要找什么软件,结果解决方法让人哭笑不得。
方法就是:把扩展名里面的字母”s”改成”t”。
如果看不到扩展名,就打开任意一个文件夹,点击“工具”里的”文件夹选项“里的”查看“,将”隐藏已知文件类型的扩展名“选项前的钩给去掉就可以了。
试了一下,居然神奇的打开了。。

贝贝爸 发表在 技术文章 | 等您写评论

28 08年3月

windows Live Messager(msn)一上线就CPU占用高的一种解决方案

关键字:,

自从msn更新到Windows Live Messenger 8以后,我就遇到了上线后CPU占用高,100%,基本上机器就没办法用了以后的8.1版本也一样。网上找,怎么也找不到原因,别人却没问题。上新的,没有联系人的帐号就没问题。我以为是联系人太多了,只好把原来一个msn换成2个问题仿佛暂时解决了,只是偶尔还会遇到这个问题,让人抓狂。
今天逛DRL,发现有一种解决方案如下,前提是你的机器使用的是nod32杀毒软件:

把%HOMEPATH%\Contacts\【your msn ID】\contactcoll.cache
在nod32的amon设置里面排除掉。如果有多个msn需要排除多个。
我的也是cpu100%。排除过文件后彻底好了。

排除了看看效果。

贝贝爸 发表在 技术文章 | 等您写评论

20 08年3月

上百个让你事半功倍的jquery插件

关键字:, ,

jQuery是一个了不起的javascript库,它可以是我们用很少的几句代码就可以创建出漂亮的页面效果。从网站的方面说,这使得javascript更加有趣。

很多jquery爱好者开发了基于jquery的插件,在这里
发现作者收集好多jquery的插件,转贴过来,给大家分享。

File upload-文件上传

Ajax File Upload
jQUploader
Multiple File Upload plugin
jQuery File Style
Styling an input type file
Progress Bar Plugin

Form Validation-表单验证

jQuery Validation
阅读全部»

贝贝爸 发表在 技术文章 | 等您写评论

19 08年3月

HttpWatch Professional v5.2.16 YAG

关键字:,

一直在用这个东西,是调试,测试web程序,地好东西。
5以后的版本改变还是比较大的,time chart很直观,对语言编码的支持也有改进。
一直在用5.1.23,今天看到有新版的出来,下载到,迫不及待的装上,看到了一个新的菜单,tools,增加了清除cache和cookie的功能,很好的功能,早就应该有了。
还可以设置自动自动的进行记录和保存日志文件,不需要手工点击,日志文件可以指定输出到一个目录。
看帮助可以自己写js,ruby,c#等脚本,来进行全自动的操作。跑了个js的sample,好像还不错,推荐大家都用哦。

贝贝爸 发表在 技术文章 | 1个评论

21 08年2月

oracle的时间格式

关键字:

查看当前oracle时间的格式
select * from nls_session_parameters where parameter = ‘NLS_DATE_FORMAT’;
修改当前session的format
alter session set NLS_DATE_FORMAT=’YYYY-MM-DD HH24:MI:SS’;
windows修改时间格式并保存
客户端的注册表HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE->HOME0中,如无默认的日期格式,则“新建”->“字符串”,重命名为“NLS_DATE_FORMAT”(注意引号内的字符应大写),并赋值为如:yyyy-mm-dd hh24:mi:ss, 可直接使用,而不需要重启Oracle。

贝贝爸 发表在 技术文章 | 等您写评论

3 08年2月

按文件扩展名grep字符串

关键字:

grep -r –include=*.php “customers_wb_list” ./

贝贝爸 发表在 技术文章 | 等您写评论

美体小铺急救棒 the bodyshop body shop 美体小铺茶树精油 美体小铺接骨木花眼胶 美体小铺VE眼霜
美体小铺急救棒 the bodyshop body shop 美体小铺茶树精油 美体小铺接骨木花眼胶 美体小铺VE眼霜