文本处理常用方法

re

准备正则表达式

  • 在正则表达式中,如果直接给出字符,就是精确匹配。
    \d 可以匹配一个数字
    \W 匹配非字母数字及下划线
    \w 可以匹配一个字母或数字
    \s 空格
  • 要匹配变长的字符,在正则表达式中,用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符:
    例:\d{3}\s+\d{3,8}
    表示的意思:\d{3}表示匹配3个数字,例如’010’;\s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格,例如匹配’ ‘,’ ‘等;\d{3,8}表示3-8个数字,例如’1234567’
re.match(r'\d{3}\-\d{3,8}', '021-12345')
  • 要做更精确地匹配,可以用[]表示范围
    例如:
[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;

[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100','0_Z','Py3000'等等;

[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;

[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。

A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'。

^表示行的开头,^\d表示必须以数字开头。

$表示行的结束,\d$表示必须以数字结束。

py也可以匹配'python',但是加上^py$就变成了整行匹配,就只能匹配'py'了。
re.match(r'py', 'python')
Out[10]: 
# 例子
>>> import re
>>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
>>>

match

re.search 扫描整个字符串并返回第一个成功的匹配

"""
语法
re.search(pattern, string, flags=0)
pattern	匹配的正则表达式
string	要匹配的字符串。
flags	标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
匹配成功re.search方法返回一个匹配的对象,否则返回None。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
"""
#!/usr/bin/python
import re
 
line = "Cats are smarter than dogs";
 
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
 
if searchObj:
   print "searchObj.group() : ", searchObj.group()
   print "searchObj.group(1) : ", searchObj.group(1)
   print "searchObj.group(2) : ", searchObj.group(2)
else:
   print "Nothing found!!"

sub

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

#!/usr/bin/python
import re
 
line = "Cats are smarter than dogs";
 
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print "match --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"
 
matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
   print "search --> searchObj.group() : ", matchObj.group()
else:
   print "No match!!"

sub

Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。

"""
语法:

re.sub(pattern, repl, string, count=0, flags=0)
参数:

pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
"""
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import re
 
phone = "2004-959-559 # 这是一个国外电话号码"
 
# 删除字符串中的 Python注释 
num = re.sub(r'#.*$', "", phone)
print "电话号码是: ", num
 
# 删除非数字(-)的字符串 
num = re.sub(r'\D', "", phone)
print "电话号码是 : ", num
以上实例执行结果如下:
电话号码是:  2004-959-559 
电话号码是 :  2004959559

split

re.split
split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:

"""
re.split(pattern, string[, maxsplit=0, flags=0])
参数:

参数	描述
pattern	匹配的正则表达式
string	要匹配的字符串。
maxsplit	分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
flags	标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
"""
import re
s='abc,  abc,  defg,  dds'
re.split('(\W+)',s)
result:['abc', ',  ', 'abc', ',  ', 'defg', ',  ', 'dds']
说明:\W匹配任何非单词字符

import re
s='abc,  abc,  defg,  dds'
re.split('(\W+)',s)
['abc', ',  ', 'abc', ',  ', 'defg', ',  ', 'dds']
说明:如果加上括号,结果会同时返回去掉的值

string

split

不支持正则及多个切割符号,不感知空格的数量,比如用空格切割,会出现下面情况。

>>> s1="aa bb  cc"  
>>> s1.split(' ')  
['aa', 'bb', '', 'cc'] 

spritlines

Python splitlines() 按照行(’\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。

str1 = 'ab c\n\nde fg\rkl\r\n'
print str1.splitlines();
 
str2 = 'ab c\n\nde fg\rkl\r\n'
print str2.splitlines(True)

['ab c', '', 'de fg', 'kl']
['ab c\n', '\n', 'de fg\r', 'kl\r\n']

strip

Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。

注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。

# re.match(pattern, string, flags=0)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
str = "00000003210Runoob01230000000"; 
print str.strip( '0' );  # 去除首尾字符 0
 
 
str2 = "   Runoob      ";   # 去除首尾空格
print str2.strip();
result:
3210Runoob0123
Runoob

# 只要头尾包含有指定字符序列中的字符就删除:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
str = "123abcrunoob321"
print (str.strip( '12' ))  # 字符序列为 12
3abcrunoob3

你可能感兴趣的:(Python)