正则表达式笔记三则

 更新时间:2010年07月27日 20:58:51   作者:  
笔记三则,贴在这里。
首字母大小写无关模式
有一段时间,我在写正则表达式来匹配Drug关键字时,经常写出 /viagra|cialis|anti-ed/ 这样的表达式。为了让它更美观,我会给关键词排序;为了提升速度,我会使用 /[Vv]iagra/ 而非/viagra/i ,只让必要的部分进行大小写通配模式。确切地说,我是需要对每个单词的首字母进行大小写无关的匹配。

我写了这样的一个函数,专门用来批量转换。

复制代码 代码如下:

#convert regex to sorted list, then provide both lower/upper case for the first letter of each word
#luf means lower upper first

sub luf{
# split the regex with the delimiter |
my @arr=sort(split(/\|/,shift));

# provide both the upper and lower case for the
# first leffer of each word
foreach (@arr){s/\b([a-zA-Z])/[\l$1\u$1]/g;}

# join the keyword to a regex again
join('|',@arr);
}

print luf "sex pill|viagra|cialis|anti-ed";
# the output is:[aA]nti-[eE]d|[cC]ialis|[sS]ex [pP]ill|[vV]iagra

控制全局匹配下次开始的位置

记得jyf曾经问过我,如何控制匹配开始的位置。嗯,现在我可以回答这个问题了。Perl 提供了 pos 函数,可以在 /g 全局匹配中调整下次匹配开始的位置。举例如下:
复制代码 代码如下:

$_="abcdefg";
while(/../g)
{
print $&;
}

其输出结果是每两个字母,即ab, cd, ef

可以使用 pos($_)来重新定位下一次匹配开始的位置,如:

复制代码 代码如下:

$_="abcdefg";
while(/../g)
{
pos($_)--; #pos($_)++;
print $&;
}

输出结果:

复制代码 代码如下:

pos($_)--: ab, bc, cd, de, ef, fg.
pos($_)++: ab, de.

可以阅读 Perl 文档中关于 pos的章节获取详细信息。

散列与正则表达式替换
《effective-perl-2e》第三章有这样一个例子(见下面的代码),将特殊符号转义。
复制代码 代码如下:

my %ent = { '&' => 'amp', '<' => 'lt', '>' => 'gt' };
$html =~ s/([&<>])/&$ent{$1};/g;

这个例子非常非常巧妙。它灵活地运用了散列这种数据结构,将待替换的部分作为 key ,将与其对应的替换内容作为 value 。这样只要有匹配就会捕获,然后将捕获的部分作为 key ,反查到 value 并运用到替换中,体现了高级语言的效率。

不过,这样的 Perl 代码,能否移植到 Python 中呢? Python 同样支持正则,支持散列(Python 中叫做 Dictionary),但是似乎不支持在替换过程中插入太多花哨的东西(替换行内变量内插)。

查阅 Python 的文档,(在 shell 下 执行 python ,然后 import re,然后 help(re)),:

复制代码 代码如下:

sub(pattern, repl, string, count=0)
Return the string obtained by replacing the leftmost
non-overlapping occurrences of the pattern in string by the
replacement repl. repl can be either a string or a callable;
if a string, backslash escapes in it are processed. If it is
a callable, it's passed the match object and must return
a replacement string to be used.

原来 python 和 php 一样,是支持在替换的过程中使用 callable 回调函数的。该函数的默认参数是一个匹配对象变量。这样一来,问题就简单了:

复制代码 代码如下:

ent={'<':"lt",
'>':"gt",
'&':"amp",
}

def rep(mo):
return ent[mo.group(1)]

html=re.sub(r"([&<>])",rep, html)

python 替换函数 callback 的关键点在于其参数是一个匹配对象变量。只要明白了这一点,查一下手册,看看该种对象都有哪些属性,一一拿来使用,就能写出灵活高效的 python 正则替换代码。

相关文章

  • JS基础教程——正则表达式示例(推荐)

    JS基础教程——正则表达式示例(推荐)

    本文给大家分享js基础之正则表达式知识,以及在正则表达式中() [] {}所代表的意思,本文给大家介绍的非常详细,需要的朋友参考下
    2017-01-01
  • javascript正则表达式分析

    javascript正则表达式分析

    想必很多人都对正则表达式都头疼。今天,我以我的认识,加上网上一些文章,希望用常人都可以理解的表达方式来和大家分享学习经验。
    2008-05-05
  • 正则表达式与HTML5新元素

    正则表达式与HTML5新元素

    这篇文章主要介绍了正则表达式与HTML5新元素的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • JAVA中正则表达式小总结(整理)

    JAVA中正则表达式小总结(整理)

    昨天,有朋友请教我关于正则表达式的问题,就这点问题当时也真是把我难住了,无奈不得不学习了,于是到搜了写相关资料,为了加深了印象,现把相关内容整理如下,供大家参考学习
    2015-09-09
  • Eclipse使用正则表达式快速修改代码的方法

    Eclipse使用正则表达式快速修改代码的方法

    这篇文章主要介绍了Eclipse使用正则表达式快速修改代码的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • Java正则表达式入门学习

    Java正则表达式入门学习

    这篇文章主要介绍了Java正则表达式入门学习基础知识,全面分析了表示匹配次数的符号使用方法,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • 开发过程最全的正则表达式匹配中英文、字母和数字

    开发过程最全的正则表达式匹配中英文、字母和数字

    这篇文章主要介绍了开发过程最全的正则表达式匹配中英文、字母和数字 的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • 谈谈正则表达式中的句号.

    谈谈正则表达式中的句号.

    好久没更新内容了,今天分享一个小的知识点,一个正则表达式方面的很容易被人忽视的坑,需要的朋友可以参考下
    2018-06-06
  • 正则表达式之回溯

    正则表达式之回溯

    我通常在匹配一个字符串或是一组数字的时候会用到正则表达式,但很少会了解它是如何真正开始工作的?它的工作原理是什么?其实正则表达式里面的猫腻还挺多水也挺深的,有时候还不太好理解。
    2010-04-04
  • grep正则表达式匹配中括号的方法实例

    grep正则表达式匹配中括号的方法实例

    正则中的括号有不同的意义,不同的字符在括号中也有不同的意义,下面这篇文章主要给大家介绍了关于grep正则表达式匹配中括号的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09

最新评论