您的位置:首页 > 编程语言 > Python开发

比较详细Python正则表达式操作指南(re使用)[11]

2014-04-19 23:13 801 查看
在下面的例子里,替换函数将十进制翻译成十六进制:


#!python




>>> def hexrepl(
match ):






"Return
the hex string for a decimal number"






value = int(
match.group() )






return hex(value)










>>> p = re.compile(r'"d+')




>>> p.sub(hexrepl, 'Call
65490 for printing, 49152 for user code.')




'Call
0xffd2 for printing, 0xc000 for user code.'



当使用模块级的 re.sub() 函数时,模式作为第一个参数。模式也许是一个字符串或一个 `RegexObject`;如果你需要指定正则表达式标志,你必须要么使用 `RegexObject` 做第一个参数,或用使用模式内嵌修正器,如
sub("(?i)b+", "x", "bbbb BBBB") returns 'x x'。

常见问题

正则表达式对一些应用程序来说是一个强大的工具,但在有些时候它并不直观而且有时它们不按你期望的运行。本节将指出一些最容易犯的常见错误。

使用字符串方式

有时使用 re 模块是个错误。如果你匹配一个固定的字符串或单个的字符类,并且你没有使用 re 的任何象 IGNORECASE 标志的功能,那么就没有必要使用正则表达式了。字符串有一些方法是对固定字符串进行操作的,它们通常快很多,因为都是一个个经过优化的C
小循环,用以代替大的、更具通用性的正则表达式引擎。

举个用一个固定字符串替换另一个的例子;如,你可以把 "deed" 替换成 "word"。re.sub() seems like the function to use for this, but consider the replace() method. 注意 replace() 也可以在单词里面进行替换,可以把 "swordfish" 变成 "sdeedfish",不过 RE 也是可以做到的。(为了避免替换单词的一部分,模式将写成 "bword"b,这是为了要求 "word" 两边有一个单词边界。这是个超出替换能力的工作)。

另一个常见任务是从一个字符串中删除单个字符或用另一个字符来替代它。你也许可以用象 re.sub('"n',' ',S) 这样来实现,但 translate() 能够实现这两个任务,而且比任何正则表达式操作起来更快。

总之,在使用 re 模块之前,先考虑一下你的问题是否可以用更快、更简单的字符串方法来解决。

match() vs search()

match() 函数只检查 RE 是否在字符串开始处匹配,而 search() 则是扫描整个字符串。记住这一区别是重要的。记住,match() 只报告一次成功的匹配,它将从 0 处开始;如果匹配不是从 0 开始的,match() 将不会报告它。


#!python




>>> print re.match('super', 'superstition').span()




(0, 5)




>>> print re.match('super', 'insuperable')




None

另一方面,search() 将扫描整个字符串,并报告它找到的第一个匹配。


#!python




>>> print re.search('super', 'superstition').span()




(0, 5)




>>> print re.search('super', 'insuperable').span()




(2, 7)

有时你可能倾向于使用 re.match(),只在RE的前面部分添加 .* 。请尽量不要这么做,最好采用 re.search() 代替之。正则表达式编译器会对 REs 做一些分析以便可以在查找匹配时提高处理速度。一个那样的分析机会指出匹配的第一个字符是什么;举个例子,模式
Crow 必须从 "C" 开始匹配。分析机可以让引擎快速扫描字符串以找到开始字符,并只在 "C" 被发现後才开始全部匹配。

添加 .* 会使这个优化失败,这就要扫描到字符串尾部,然後回溯以找到 RE 剩馀部分的匹配。使用 re.search() 代替。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: