正则表达式如何匹配括号对? 在字符串中存在多层括号的情况下,是否可以用正则表达式准确地匹配出同一层级的开闭括号呢? 样例: 需求:只匹配某一层括号内的所有内容,例如 , 即为需要匹配的字符串。 一张图汇总下正则表达式匹配规则(建议保存)
Python 的 re 模块 在 Python 中,我们可以使用内置的 re 模块来使用正则表达式。 有一点需要特别注意的是,正则表达式使用 对特殊字符进行转义,所以如果我们要使用原始字符串,只需加一个 r 前缀,示例: re 模块的一般使用步骤如下: 使用 函数将正则表达式的字符串形式编译为一个 对象通过 对象提供的一系列方法对文本进行匹配查找,获得匹配结果,一个 Match 对象。最后使用 对象提供的属性和方法获得信息,根据需要进行其他的操作 compile 函数 compile 函数用于编译正则表达式,生成一个 Pattern 对象,它的一般使用形式如下: 在上面,我们已将一个正则表达式编译成 Pattern 对象,接下来,我们就可以利用 pattern 的一系列方法对文本进行匹配查找了。 Pattern 对象的一些常用方法主要有:match 方法:从起始位置开始查找,一次匹配search 方法:从任何位置开始查找,一次匹配findall 方法:全部匹配,返回列表finditer 方法:全部匹配,返回迭代器split 方法:分割字符串,返回列表sub 方法:替换 match 方法 match 方法用于查找字符串的头部(也可以指定起始位置),它是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果。它的一般使用形式如下: 其中,string 是待匹配的字符串,pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。因此,当你不指定 pos 和 endpos 时,match 方法默认匹配字符串的头部。 当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。 在上面,当匹配成功时返回一个 Match 对象,其中:group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);start([group]) 方法用于分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;end([group]) 方法用于分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;span([group]) 方法返回 (start(group), end(group))。 再看看一个例子: —————————————————————————————————— search 方法 search 方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果,它的一般使用形式如下: 其中,string 是待匹配的字符串,pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。 当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。 让我们看看例子: 再来看一个例子: 执行结果: —————————————————————————————————— findall 方法 上面的 match 和 search 方法都是一次匹配,只要找到了一个匹配的结果就返回。然而,在大多数时候,我们需要搜索整个字符串,获得所有匹配的结果。 findall 方法的使用形式如下: 其中,string 是待匹配的字符串,pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。 findall 以列表形式返回全部能匹配的子串,如果没有匹配,则返回一个空列表。 看看例子: 执行结果: 再先看一个栗子: 运行结果: —————————————————————————————————— finditer 方法 finditer 方法的行为跟 findall 的行为类似,也是搜索整个字符串,获得所有匹配的结果。但它返回一个顺序访问每一个匹配结果(Match 对象)的迭代器。 看看例子: 执行结果: split 方法 split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下: 其中,maxsplit 用于指定最大分割次数,不指定将全部分割。 看看例子: 执行结果: sub 方法 sub 方法用于替换。它的使用形式如下: 其中,repl 可以是字符串也可以是一个函数:如果 repl 是字符串,则会使用 repl 去替换字符串每一个匹配的子串,并返回替换后的字符串,另外,repl 还可以使用 id 的形式来引用分组,但不能使用编号 0;如果 repl 是函数,这个方法应当只接受一个参数(Match 对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。count 用于指定最多替换次数,不指定时全部替换。 看看例子: 执行结果: —————————————————————————————————— 匹配中文 在某些情况下,我们想匹配文本中的汉字,有一点需要注意的是,中文的 unicode 编码范围 主要在 [u4e00-u9fa5],这里说主要是因为这个范围并不完整,比如没有包括全角(中文)标点,不过,在大部分情况下,应该是够用的。 假设现在想把字符串 title = u’你好,hello,世界’ 中的中文提取出来,可以这么做: 注意到,我们在正则表达式前面加上了两个前缀 ur,其中 r 表示使用原始字符串,u 表示是 unicode 字符串。 执行结果: 注意:贪婪模式与非贪婪模式 贪婪模式:在整个表达式匹配成功的前提下,尽可能多的匹配 ( * );非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配 ( ? );Python里数量词默认是贪婪的。 示例一 : 源字符串: 使用贪婪的数量词的正则表达式 ,匹配结果: abbb。 决定了尽可能多匹配 b,所以a后面所有的 b 都出现了。使用非贪婪的数量词的正则表达式,匹配结果: a。即使前面有 ,但是 决定了尽可能少匹配 b,所以没有 b。 示例二 : 源字符串: 使用贪婪的数量词的正则表达式:匹配结果:这里采用的是贪婪模式。在匹配到第一个“”时已经可以使整个表达式匹配成功,但是由于采用的是贪婪模式,所以仍然要向右尝试匹配,查看是否还有更长的可以成功匹配的子串。匹配到第二个“”后,向右再没有可以成功匹配的子串,匹配结束,匹配结果为“”使用非贪婪的数量词的正则表达式:匹配结果:正则表达式二采用的是非贪婪模式,在匹配到第一个“”时使整个表达式匹配成功,由于采用的是非贪婪模式,所以结束匹配,不再向右尝试,匹配结果为“”。 正则表达式测试网址
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/84809.html