正则表达式使用举例一(Python下)

目录

  • [1 问题描述](#1 问题描述)
  • [2 解决](#2 解决)
    • [2.1 问题1的解决](#2.1 问题1的解决)
    • [2.2 问题2的解决](#2.2 问题2的解决)

摘要:本文给出了一个在Python语言中利用re包进行正则表达式匹配计算的例子。详细讲述了所写的正则表达式的含义,还对搜索结果对象的span()函数进行运用举例,从而成功提取出原字符串中的三部分。

1 问题描述

有下面所述的字符串,

' 你好左,QTZ(Ap^max),右边'

'左边描述,QT2(xx1/xx2^ out^ on)QT2(xx2/xx2^out),右边描述'

'左边描述,%QT2(xx1/xx2 ^ out^ on)QT2(xx2/xx2^out),右边描述'

问题1:编写代码将上面三种情况的字符串中的"QTZ(Ap^max)"、"QT2(xx1/xx2 ^ out^ on)QT2(xx2/xx2^out)"、"%QT2(xx1/xx2 ^ out ^ on)QT2(xx2/xx2 ^out)"查询匹配出来?

问题2:写代码,将上面字符串分别分成三部分,第一部分是要匹配的字符串的左边部分子字符串,第二部分是问题1要匹配的字符串,第三部分是要匹配的字符串的右边部分子字符串。

2 解决

2.1 问题1的解决

在Python语言环境下,写如下的字符串表达式:

python 复制代码
r"%?QT\w\(.*\)"

上面字符串表达式的含义解释如下:

  1. r是Python语言中的机制,表示后面所跟的字符串保持原样,亦即Python中的转义字符机制不发生作用;
  2. %,表示匹配该字符;
  3. ?,表示其前面的字符%可以出现1次,也可以出现0次(不出现);
  4. QT,原样匹配;
  5. \w,是正则表达式中预先定义的字符类[1](#1),表示匹配一个字母字符或数字字符,等价于[a-zA-Z0-9];
  6. \(,表示匹配一个(,因为(在正则表达式中是元字符,启指令作用,所以要匹配字符(需要正则表达式中的转义字符\
  7. .,表示匹配任何一个字符;
  8. *,表示对前面出现的一个字符重复多次;
  9. \),与\(同义。

上面所写的正则表达式刚好能匹配小节1里面的三种情况的字符串中要匹配的子字符串,即:"QTZ(Ap^max)"、"QT2(xx1/xx2 ^ out^ on)QT2(xx2/xx2^out)"、"%QT2(xx1/xx2 ^ out ^ on)QT2(xx2/xx2 ^out)"。

在Python语言中,编写解决问题1的代码,并运行,如下:

python 复制代码
>>> import re
>>> s = ' 你好左,QTZ(Ap^max),右边'
>>> s2 = '左边描述,QT2(xx1/xx2^out^on)QT2(xx2/xx2^out),右边描述'
>>> s3 = '左边描述,%QT2(xx1/xx2^out^on)QT2(xx2/xx2^out),右边描述'
>>> pat = re.compile(r"%?QT\w\(.*\)")
>>> pat.search(s)
<re.Match object; span=(5, 16), match='QTZ(Ap^max)'>
>>> pat.search(s2)
<re.Match object; span=(5, 40), match='QT2(xx1/xx2^out^on)QT2(xx2/xx2^out)'>
>>> pat.search(s3)
<re.Match object; span=(5, 41), match='%QT2(xx1/xx2^out^on)QT2(xx2/xx2^out)'>
>>>

从上面代码的运行结果可以看出,Python中re的正则表达式匹配默认启用贪婪模式(greedy),因为能匹配出'QT2(xx1/xx2^out^on)QT2(xx2/xx2^out)'。如果是非贪婪模式的话,则能匹配出两个结果'QT2(xx1/xx2^out^on)''QT2(xx2/xx2^out)'

2.2 问题2的解决

以问题小节中描述的第三个字符串为例,从中提取出三部分代码如下:

python 复制代码
>>> s3 = '左边描述,%QT2(xx1/xx2^out^on)QT2(xx2/xx2^out),右边描述'
>>> pat = re.compile(r"%?QT\w\(.*\)")
>>> searchResult = pat.search(s3)
>>> m,n = searchResult.span()
>>> m
5
>>> n
41
>>> s3[0:m]
'左边描述,'
>>> s3[m:n]
'%QT2(xx1/xx2^out^on)QT2(xx2/xx2^out)'
>>> s3[n:]
',右边描述'
>>>

上述解决问题2的代码中,利用了搜索结果对象中的span()函数,该函数给出了匹配的字符串结果在原字符串中的起始索引,利用该起始索引,我们可以成功将原字符串的三部分提取出来。


  1. Félix López, Víctor Romero. Mastering Python Regular Expressions. Packt Publishing Ltd, 2014. P12-13. ↩︎
相关推荐
Bellafu6663 分钟前
selenium常用的等待有哪些?
python·selenium·测试工具
小白学大数据1 小时前
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
爬虫·python·ajax
2401_841495642 小时前
【计算机视觉】基于复杂环境下的车牌识别
人工智能·python·算法·计算机视觉·去噪·车牌识别·字符识别
Adorable老犀牛2 小时前
阿里云-ECS实例信息统计并发送统计报告到企业微信
python·阿里云·云计算·企业微信
倔强青铜三2 小时前
苦练Python第66天:文件操作终极武器!shutil模块完全指南
人工智能·python·面试
倔强青铜三3 小时前
苦练Python第65天:CPU密集型任务救星!多进程multiprocessing模块实战解析,攻破GIL限制!
人工智能·python·面试
Panda__Panda3 小时前
docker项目打包演示项目(数字排序服务)
运维·javascript·python·docker·容器·c#
Lris-KK3 小时前
力扣Hot100--94.二叉树的中序遍历、144.二叉树的前序遍历、145.二叉树的后序遍历
python·算法·leetcode
zy_destiny4 小时前
【工业场景】用YOLOv8实现抽烟识别
人工智能·python·算法·yolo·机器学习·计算机视觉·目标跟踪
(●—●)橘子……4 小时前
记力扣2009:使数组连续的最少操作数 练习理解
数据结构·python·算法·leetcode