正则表达式实例

173 阅读5分钟

截取部分文本如下:

Instruction: 分析尼康Z系列全画幅无反相机(如Z9、Z7 II)在专业风光摄影中的技术优势,结合传感器性能、镜头光学设计及机身功能,阐述其如何应对高分辨率、复杂光线场景的需求。  
Input: 用户需要一台能捕捉雪山日出时极端明暗过渡细节,同时兼顾轻量化徒步携带的相机,预算不限。  
Output:  

  1. EXPEED 7处理器与背照式传感器协同优化:尼康Z9搭载的4570万像素堆栈式CMOS传感器,配合新一代EXPEED 7处理器,实现原生ISO 64-25600范围,在雪山场景中可同时保留日出高光区域的云层纹理与阴影处冰裂隙细节。双流输出技术使14bit RAW连拍时仍能保持16档动态范围,通过机内「高动态范围(HDR)」模式可合成32bit HEIF文件,彻底解决雪地反光过曝问题。  
  2. S-Line镜头群的光学突破:尼康Z 14-24mm f/2.8 S采用4枚ED镜片和纳米结晶涂层,在逆光拍摄时消除雪山与太阳交界处的紫边和鬼影,弧形对焦马达确保-4EV弱光下精准合焦。镜身重量仅650g,比单反时代同规格镜头轻35%,搭配镁合金机身实现全天候防护,满足高原徒步的防尘防冻需求(-10℃正常运作)。  
  3. 智能场景识别与工作流革新:机身搭载90000像素RGB测光系统,可自动识别雪地、岩石、天空等元素并优化白平衡,避免蓝色暗部偏色。双CFexpress B卡槽支持ProRes 422 HQ录制,延时摄影时可实时生成4K视频预览。通过SnapBridge同步RAW文件至iPad,配合Nikon NX Studio实现基于深度学习的「自适应细节增强」,30分钟完成百张堆栈处理。

Instruction: 请详细分析佳能与尼康相机在自动对焦系统性能方面的核心差异,包括技术架构、动态追焦能力和低光环境表现,并说明这些差异如何影响专业体育摄影和婚礼跟拍的实际成片效果。  
Input: 摄影师需要在高强度拍摄场景中快速捕捉动态画面,例如足球比赛和移动中的新娘群拍,应如何基于自动对焦性能在佳能EOS R5与尼康Z9之间作出选择?  
Output:  

  1. 技术架构差异:佳能EOS R5搭载双像素CMOS AF II系统,1053个对焦点覆盖100%画面,通过深度学习算法优化人物眼部/头部追踪。尼康Z9采用Multi-CAM 3700传感器模块,配备493点相位检测,独创3D追踪模式可预测高速不规则运动轨迹。实测显示R5在横向移动追焦时焦点粘滞度达92%,而Z9对纵向迎面物体的锁定成功率高7%,源于其AI场景分析每秒120次运算的硬件优势。  
  2. 低光对焦表现:在-6EV暗光环境中,R5凭借F1.2镜头支持下-6.5EV的极限对焦能力,更适合婚礼现场烛光等微光场景,但对焦速度会降低至0.8秒/次。Z9通过独立测光传感器实现-7EV对焦,在夜间体育场馆拍摄时,配合20fps连拍仍能保持-5EV下的0.15秒快速合焦,但需要开启专用低光优化模式,可能损失部分色深数据。  
  3. 实战应用对比:体育摄影首选Z9的「自动区域AF+主体识别」组合,其3D追踪可预判运动员急停变向轨迹,搭配20fpsRAW连拍时焦点偏移率仅3%。婚礼拍摄推荐R5的「全像素双核视频AF」,眼控对焦在多人场景中能智能识别新娘,且在视频模式下支持触屏拖拽对焦点切换,但高速移动时可能产生0.03秒的呼吸效应补偿延迟。两者均需注意镜头驱动系统匹配,RF镜头STM马达更适合静音拍摄,而Z系镜头步进马达在低温环境下稳定性更优。

现在目标是利用正则表达式,将Instruction格式的数据转换为pandas里面的DataFrame格式,进一步利用datasets库将Dataframe转化成dataset,得到可以进一步给模型训练的格式。
本文只设计第一步:如何用正则表达式上述文本进行处理。

import re
import pandas as pd

pattern = r"Instruction:(.*?)\nInput:(.*?)\nOutput:(.*?)\n(?:\n\n|$)"
# text之上述文本
matches = re.findall(text, pattern, re.DOTALL)

df = pd.DataFrame(matches, columns = ['Instruction', 'Input', 'Output']

以下是对该代码段的解释:

  1. r""代表的是raw string, 指明双引号内部的字符串就是原始字符串,忽略掉转义字符\的影响
  2. Instruction:(.*?)\n是一个整体,.指除换行符\n以外的任意字符,*代表这样的字符有任意多个,?代表非贪婪格式。所以非贪婪,说人话就是一旦(.*?)遇到第一个换行符\n,匹配就会停止。与之相对,如果使用(.*),那么Instruction:(.*)\n会匹配最后一个换行符,这样就会把整个文本匹配进去,明显不是我们想要的结果,所以必须加?
  3. Input:(.*?)\n:(.*?)\n原理和 Instruction:(.*?)\n类似。
  4. (?:\n\n|$)可以拆成两部分看,分别是?:\n\n|$
    • ?:的作用是匹配但不包含,就是说我会匹配两个换行符,但是匹配成功后不会把\n\n包含进去。
    • \n\n|$的意思是\n\n$二选一,一旦匹配到两个换行符或者字符串结尾了就匹配成功。

以上是对代码段中使用到的正则表达式的简单解释。pattern的作用就是匹配当个的样本,然后很多个这样的样本组成一个列表放入matches中,最后转换得到df。作为数据处理的一部分,正则表达式很有用,理解其背后作用,有助于筛选出高质量数据,进一步提供给模型训练。