Python字符串全解之正则表达式逻辑运算或

 更新时间:2026年10月16日 09:37:23   作者:小白快快跑哦  
Python字符串处理,这块衔接起来应该很顺畅,如果后面遇到复杂的多条件匹配,优先考虑用括号把 | 的作用范围限制清楚,会省掉很多调试时间,‌‌本文重点介绍python字符串全解:正则表达式-逻辑运算或的相关知识,感兴趣的朋友一起看看吧

在上一章我们提到过,正则表达式没有专门的逻辑与(&)非(!)运算,因为顺序的正则表达式字符就是与运算,例如正则表达式r'abc',这里面的含义就是有一个字符串,需要第一个字符是a且第二个字符是b且第三个字符是c,这本身就是一个与(&)运算,只是不是通过显式的符号完成。同样的非,我们有负向先后行断言(?!),(?<=)来确定前面的或者后面不是某个字符或者字符串,还有就是在字符类中我们用^来说明当前字符不能出现在括号中,例如[^abc]表示当前字符不能是abc中的一个。这样前中后刚好凑齐了逻辑非!。这三种情况都很详细的讲解了,之前我们简单的提到或|运算符,本章我们详细的讲解一下。

在正则表达式里,‌逻辑“或”用竖线 | 表示‌,用来匹配多个备选模式中的任意一个。你之前已经学过字面字符和字符类,| 正是把这两种思路组合起来、实现“匹配 A 或 B”的关键语法。‌‌

或的含义和python语言中的or是一个意思,表示两个选择或者多个选择,只要符合其中一个条件即可,在正则表达式中就是可以用一个正则表达式表示多种组合,要是没有或,我们可能就需要多写几个正则表达式了,这样无疑做了很多重复的工作。接下来,我们来详细说一下逻辑或的应用场景。

9.1整个正则匹配其中一个

就是用|将正则表达式分为两个或者多个部分,只需要匹配其中某个部分即可。看下面的代码:

import re
import time
a = "abc efg hij"
b = re.findall(r"abc|efg", a)
c = re.findall(r'abc|efg|hij', a)
print("b = {}, c = {}".format(b, c))
# 输出结果:b = ['abc', 'efg'], c = ['abc', 'efg', 'hij']

b中我们用|连接abc和efg,意思是只要匹配abc或者efg中任何一个子串都满足要求,可以看到结果我们得到了abc和efg两个结果。c是匹配abc,efg和hij任何一个子串都满足要求,结果便是abc,efg,hij。

9.2在分组中匹配其中一个

在分组中使用或,或的作用范围只是在分组内,我们看一下下面的代码:

import re
a = "abc21efg123hij111"
b = re.findall(r"(?:abc|efg)\d+", a)
c = re.findall(r'(?:abc|efg|hij)\d+', a)
print("b = {}, c = {}".format(b, c))
# 输出结果:b = ['abc21', 'efg123'], 
# c = ['abc21', 'efg123', 'hij111']

我们用(?:...)表示不捕获分组内容,让findall返回完整的正则匹配内容,可以看到逻辑或|只是限制在分组内,对于b来讲只要满足abc后面跟数字或者efg后面跟数字,都符合正则表达式的要求,所以得到了abc21和efg123。c也是同样的意思是,只是多了一个选择。

如果我们不使用括号,则逻辑或|的作用域会扩展到整个正则表达式,我们看下面的例子:

import re
a = "abc21efg123hij111"
b = re.findall(r"abc|efg\d+", a)
c = re.findall(r'abc|efg|hij\d+', a)
print("b = {}, c = {}".format(b, c))
# 输出结果:b = ['abc', 'efg123'], 
# c = ['abc', 'efg', 'hij111']

b的结果来看,我们需要寻找满足abc或者efg\d+这样的子串,而不是满足abc\d+或者efg\d+的子串,这说明失去了分组,逻辑或|便会作用于全局。c的效果也是一样,只有最后一个匹配带了数字。

9.3 和量词组合

在9.2的第一个例子中,我们只是将逻辑或|放在分组中,此时如果在分组外面加量词,就会有排列组合的效果,我们看一下下面的代码:

import re
a = "abcefg123efgabchij123efghij111"
b = re.findall(r"(?:abc|efg)+", a)
c = re.findall(r'(?:abc|efg|hij)+', a)
d = re.findall(r"(?:abc|efg)+?", a)
e = re.findall(r'(?:abc|efg|hij)+?', a)
print("b = {}, c = {}, d = {}, e = {}".
      format(b, c, d ,e))
# 输出结果:b = ['abcefg', 'efgabc', 'efg'], 
# c = ['abcefg', 'efgabchij', 'efghij'], 
# d = ['abc', 'efg', 'efg', 'abc', 'efg'], e
# = ['abc', 'efg', 'efg', 'abc', 'hij', 'efg', 'hij']

b在分组外面加了一个+,我们看到abcefg和efgabc都会被匹配到,原因是+是贪婪算法,字符串匹配到abc的时候,会继续匹配,这时候efg也能匹配,所以会匹配出abcefg的结果,同样,后续字符串中efg被匹配到,可以继续匹配,匹配到了efgabc。c也一样,只是c可以匹配三个的组合,例如匹配到了efgabcchij。d和e只是在+后面加了?,表示非贪婪匹配,所以我们看到没有匹配到组合,只需要匹配到分组中的任何一个就算匹配成功。

当然,如果你要匹配固定次数的组合,可以用{n}来代替+,这样可能还不能满足业务需求,例如你需要abc,efg,hig这三个组合中的任意两个组合,并且并不能是两个相同的组合在一起,例如不能出现abcabc,efgefg这样的情况,只是用固定次数还不能满足,这还需要用到前面讲到的前后相断言。我们看一下下面的代码:

import re
a = "abcefg|abchij|abcabc|hijhij|efghij|efgefg"
b = re.findall(r'''(?x)(?:abc(?!abc)|
               efg(?!efg)|hij(?!hij)){2}''', a)
print("b = {}".
      format(b))
# 输出结果:b = ['abcefg', 'abchij', 'efghij']

可以看到字符串a是abc,efg,hij这三个子串的任何组合,中间用|分割,记住这个在字符串中只是普通的字符|。b中首先我们用了全局的详细模式,表明这个正则表达式忽略换行,回车,tab,空格等,所以我们把正则分成了两行。然后我们在abc后面面用了负向先行断言(?!abc),表明abc的后面不是能是abc,同样的,efg的后面不能是efg,以及hij的后面不能是hij,通过这种断言,我们会过滤到abcabc,efgefg,hijhij这种两个重复的情况,可以看到结果b也确实如此,可以看到通过组合正则语法,我们可以写出强大实用的功能。

9.4字符类中的或|

如果你在字符类中写了或|,那么这个字符将变成普通字符,而不是逻辑或。原因是在字符类中的每个字符都是或的关系,所以没必要再加一个或的运算符,所以|会自动被当成普通字符。看一下下面的代码:

import re
a = "a1|2c2|3\\3"
b = re.findall(r'[abc|]\d', a)
c = re.findall(r'[abc\|]\d', a)
print("b = {}, c = {}".format(b, c))
# 输出结果:b = ['a1', '|2', 'c2', '|3'],
# c = ['a1', '|2', 'c2', '|3']

b中我们在字符类中加了|,我们可以看到结果中有|2,|3,所以在字符类中,|就是一个普通字符,在c中用反斜杠做了转义,效果和b是一样的。所以不论你加不加反斜杠,|在字符类中都只代表自己。

到这里这一章就结束了,这一章没什么新的内容其实,只是将之前学到的内容在稍微的复杂化一下,在下一章中,我们将会讨论元字符,这也不是什么新的内容,我们一直在用,只是没有明确的说明。

到此这篇关于Python字符串全解之正则表达式逻辑运算或的文章就介绍到这了,更多相关python正则表达式逻辑运算或内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现的生成格雷码功能示例

    Python实现的生成格雷码功能示例

    这篇文章主要介绍了Python实现的生成格雷码功能,结合实例形式分析了格雷码的原理与Python相关实现技巧,需要的朋友可以参考下
    2018-01-01
  • Python 模拟员工信息数据库操作的实例

    Python 模拟员工信息数据库操作的实例

    下面小编就为大家带来一篇Python 模拟员工信息数据库操作的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 基于Python开发Windows自动更新控制工具

    基于Python开发Windows自动更新控制工具

    在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可以了解下
    2025-09-09
  • PyTorch中可视化工具的使用

    PyTorch中可视化工具的使用

    本文主要介绍了PyTorch中可视化工具的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • selenium UI自动化实战过程记录

    selenium UI自动化实战过程记录

    如果大家有做过web的自动化测试,相信对于selenium一定不陌生,测试人员经常使用它来进行自动化测试,下面这篇文章主要给大家介绍了关于selenium UI自动化实战的相关资料,需要的朋友可以参考下
    2021-12-12
  • Python Asyncio库之asyncio.task常用函数详解

    Python Asyncio库之asyncio.task常用函数详解

    Asyncio在经过一段时间的发展以及获取Curio等第三方库的经验来提供更多的功能,目前高级功能也基本完善。本文主要介绍了Asyncio库中asyncio.task常用函数的使用,需要的可以参考一下
    2023-03-03
  • Python实现的文本简单可逆加密算法示例

    Python实现的文本简单可逆加密算法示例

    这篇文章主要介绍了Python实现的文本简单可逆加密算法,结合完整实例形式分析了Python自定义加密与解密算法具体实现与使用技巧,需要的朋友可以参考下
    2017-05-05
  • python如何拆分含有多种分隔符的字符串

    python如何拆分含有多种分隔符的字符串

    这篇文章主要为大家详细介绍了python如何拆分含有多种分隔符的字符串,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Python环境的安装以及PyCharm编辑器配置教程详解

    Python环境的安装以及PyCharm编辑器配置教程详解

    优质的教程可以让我们少走很多弯路,这一点毋庸置疑。这篇文章主要为大家介绍了纯净Python环境的安装以及PyCharm编辑器的配置,需要的可以参考一下
    2023-04-04
  • python装饰器实例大详解

    python装饰器实例大详解

    这篇文章主要介绍了python装饰器实例大详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-10-10

最新评论