python中正则表达式的使用详解(3)
import re
def expand_abbr(sen, abbr):
lenabbr = len(abbr)
ma = ''
for i in range(0, lenabbr):
ma += abbr[i] + "[a-z]+" + ' '
print 'ma:', ma
ma = ma.strip(' ')
p = re.search(ma, sen)
if p:
return p.group()
else:
return ''
print expand_abbr("Welcome to Algriculture Bank China", 'ABC')
结果
问题
上面代码对于例子中的前3个是正确的,但是后面的两个就错了,因为大写字母开头的词语之间还夹杂着小写字母词
规律
大写字母 + 小写(大于等于1个)+ 空格 + [小写+空格](0次或1次)
参考代码
import re
def expand_abbr(sen, abbr):
lenabbr = len(abbr)
ma = ''
for i in range(0, lenabbr-1):
ma += abbr[i] + "[a-z]+" + ' ' + '([a-z]+ )?'
ma += abbr[lenabbr-1] + "[a-z]+"
print 'ma:', ma
ma = ma.strip(' ')
p = re.search(ma, sen)
if p:
return p.group()
else:
return ''
print expand_abbr("Welcome to Algriculture Bank of China", 'ABC')
技巧
中间的 小写字母集合+一个空格,看成一个整体,就加个括号。要么同时有,要么同时没有,这样需要用到?,匹配前方的整体。
三. 去掉数字中的逗号
具体示例
在处理自然语言时123,000,000如果以标点符号分割,就会出现问题,好好的一个数字就被逗号肢解了,因此可以先下手把数字处理干净(逗号去掉)。
分析
数字中经常是3个数字一组,之后跟一个逗号,因此规律为:***,***,***
正则式
[a-z]+,[a-z]?
参考代码3-1
import re
sen = "abc,123,456,789,mnp"
p = re.compile("\d+,\d+?")
for com in p.finditer(sen):
mm = com.group()
print "hi:", mm
print "sen_before:", sen
sen = sen.replace(mm, mm.replace(",", ""))
print "sen_back:", sen, '\n'
结果
技巧
使用函数finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):
搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。
参考代码3-2
sen = "abc,123,456,789,mnp"
while 1:
mm = re.search("\d,\d", sen)
if mm:
mm = mm.group()
sen = sen.replace(mm, mm.replace(",", ""))
print sen
else:
break
结果
延伸
这样的程序针对具体问题,即数字3位一组,如果数字混杂与字母间,干掉数字间的逗号,即把“abc,123,4,789,mnp”转化为“abc,1234789,mnp”
思路
更具体的是找正则式“数字,数字”找到后用去掉逗号的替换
参考代码3-3
- 上一篇:Python入门篇之编程习惯与特点
- 下一篇:基于python编写的微博应用