代码改变世界

正则表达式学习(1)

2017-06-21 17:50  很大很老实  阅读(201)  评论(0编辑  收藏  举报

 

正则表达式的学习思维是怎样的?完整的正则表达式是由小的构建单元组成的,有些构建单元可能很小,实现的功能很简单,很无趣,但却代表某一类实现,等集成到大需求里,就显示出他的重要性。

比如,要养成按照字符思考问题的习惯,举例:

^cat,不要理解为 以cat开始的一行,而是:以c开头的一行,后面跟着a,再跟着t。

采用字符方式的思考,对下面的问题就很容易理解,比如,在一个长文中,寻找pyhon,但是,又不确定是不是写成了python,也可能写成了pyhton。。。

那就这么去匹配:py[th][th]on

mystr1='i love python,but sometimes,i have a wrong :pyhton,but not pyton'
list9=re.findall('py[th][th]on',mystr1)
print(list9)

 

而且,有了这个思维以后,诸如H[123456],就好理解了,是H1,H2,H3,H4,H5,H6之类的意思。当然,也可以简写成H[1-6],注意,这里的连字符‘-’,只有在内部,才是连字符,否则,就是一个普通字符

更进一步,在[]里,^表示非的意思,排他的额意思。H[^1234567]表示啥意思呢?

mystr2='H1,H2,H3,H4,H5,H6,H7,H8,H9,H11,H22,H33,H44,H55,H66,H77,H88'

list123=re.findall('H[^123456]',mystr2)
print(list123)

 

结果是什么呢?

['H7', 'H8', 'H9', 'H7', 'H8']

Process finished with exit code 0

很显然,诸如H11,H22之类的,对于匹配来说,根本不需要考虑这么多。因为,我们是按照字符考虑的,H11,我们只考虑H1的情况,一定要记住,字符思考思维!

这里,对于[^123456],要理解为:匹配没有出现在123456中的字符,而不是理解为;匹配不是123456的字符。

举例如下;

mystr3='H'

list123=re.findall('H[^123456]',mystr3)
print(list123)

这个时候,list123就是[],空。

如果,H包含了换行符等,那就可以找到,比如:

mystr3='H\n'
print(mystr3)
list123=re.findall('H[^123456]',mystr3)
print(list123)
H

['H\n']

Process finished with exit code 0

为啥H后面2个换行?因为print自己也换行,哈。