首页 > 解决方案 > 正则表达式捕获组除以中间的数字

问题描述

我需要从一个字符串中捕获 3 个组。该字符串采用以下形式:

{phrase 1} {optional number} {optional phrase 2}

这方面的几个例子是:

Battery Bank 1
Battery Bank 1 Segments
Battery Bank 1 Warranty Logger
Battery Bank 10
Battery Bank 10 Segments
Battery Bank 10 Warranty Logger
BSU
BSU 1
PCS 3
PCS 1
System
System Meter

如您所见,唯一的强制性组是第一个由单词字符和空格组成的组,直到出现至少 1 位的数字。然后,可选地,另一组单词和空格字符。

这是我到目前为止所拥有的,但它无法正常工作。它在线条上匹配。它应该匹配每行一个。

([a-zA-Z\s]+)(\d+)?(\w)?

这是一个可以使用的 regex101 链接: https ://regex101.com/r/tSGIEm/2

标签: pythonregexpython-3.x

解决方案


您可以将此正则表达式与可选组一起使用:

([a-zA-Z]+(?:[ \t]+[a-zA-Z]+)*)(?:[ \t]+(\d+)(?:[  \t]+(.+))?)?

更新的 RegEx 演示

正则表达式详细信息:

  • (: 开始捕获组 #1
    • [a-zA-Z]+: 匹配 1+ 个字母的单词
    • (?:[ \t]+[a-zA-Z]+)*: 匹配 0 个或多个由 1+ 个空格/制表符分隔的单词
  • ): 结束捕获组 #1
  • (?:: 启动非捕获组 #1
    • [ \t]+: 匹配 1+ 个空格或制表符
    • (\d+): 匹配 1+ 个数字并在组 #2 中捕获
    • (?:: 启动非捕获组#2
      • [ \t]+: 匹配 1+ 个空格或制表符
      • (.+):匹配任何字符的 1+ 并在组 #3 中捕获
    • )?:结束可选的非捕获组#2
  • )?:结束可选的非捕获组#1

推荐阅读