Python 正则表达式(2)

<pre name="code" class="python">import re
text="Hi,I am Shirley Hilton.I am his wife."
m=re.findall(r"i.",text)    #['i,', 'ir', 'il', 'is', 'if']
if m:
    print m
else:
    print 'not match'
print '---------'
n=re.findall(r"i.\b",text)    #['i,', 'is']
if n:
    print n
else:
    print 'not match'
print '---------'
l=re.findall(r"\bi.",text)    #not match
if l:
    print l
else:
    print 'not match'
print '---------'   
p=re.findall(r".",text)    #['H', 'i', ',', 'I', ' ', 'a', 'm', ' ', 'S', 'h', 'i', 'r', 'l', 'e', 'y', ' ', 'H', 'i', 'l', 't', 'o', 'n', '.', 'I', ' ', 'a', 'm', ' ', 'h', 'i', 's', ' ', 'w', 'i', 'f', 'e', '.']
if p:
    print  p
else:
    print 'not match'
print '---------'
q=re.findall(r"i\S",text)    #['i,', 'ir', 'il', 'is', 'if']
if q:
    print q
else:
    print 'not match'
print '---------'
w=re.findall(r"I.*e",text)    #['I am Shirley Hilton.I am his wife']
if w:
    print w
else:
    print 'not match'
print '---------'
y=re.findall(r"I.*?e",text)    #['I am Shirle', 'I am his wife']
if y:
    print y
else:
    print 'not match'

 
1. 

r"hi"

这里字符串前面加了r,是raw的意思,它表示对字符串不进行转义。为什么要加这个?你可以试试print "\bhi"和r"\bhi"的区别。
>>> print "\bhi"
hi
>>> print r"\bhi"
\bhi

可以看到,不加r的话,\b就没有了。因为 python 的字符串碰到“\”就会转义它后面的字符。如果你想在字符串里打“\”,则必须要打“\\”。
>>> print "\\bhi"
\bhi

这样的话,我们的正则表达式里就会多出很多“\”,让本来就已经复杂的字符串混乱得像五仁月饼一般。但加上了“r”,就表示不要去转义字符串中的任何字符,保持它的原样。

2.
re.findall(r"hi", text)

re是python里的正则表达式模块。findall是其中一个方法,用来按照提供的正则表达式,去匹配文本中的所有符合条件的字符串。返回结果是一个包含所有匹配的list。

3.
今天主要说两个符号“.”和“*”,顺带说下“\S”和“?”。
“.”在正则表达式中表示除换行符以外的任意字符。在上节课提供的那段例子文本中:
Hi, I am Shirley Hilton. I am his wife.

如果我们用“i.”去匹配,就会得到
['i,', 'ir', 'il', 'is', 'if']

你若是暴力一点,也可以直接用“.”去匹配,看看会得到什么。

与“.”类似的一个符号是“\S”,它表示的是不是空白符的任意字符。注意是大写字符S。

4.
在很多搜索中,会用“?”表示任意一个字符,“*”表示任意数量连续字符,这种被称为通配符。但在正则表达式中,任意字符是用“.”表示,而“*”则不是表示字符,而是表示数量:它表示前面的字符可以重复任意多次(包括0次),只要满足这样的条件,都会被表达式匹配上。

结合前面的“.*”,用“I.*e”去匹配,想一下会得到什么结果?
['I am Shirley Hilton. I am his wife']

是不是跟你想的有些不一样?也许你会以为是
['I am Shirle', 'I am his wife']

这是因为“*”在匹配时,会匹配尽可能长的结果。如果你想让他匹配到最短的就停止,需要用“.*?”。如“I.*?e”,就会得到第二种结果。这种匹配方式被称为懒惰匹配,而原本尽可能长的方式被称为贪婪匹配。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值