如何提取space和符号'>'之间的字符串?

How to extract string between space and symbol '>'?

字符串 1:

 [impro:0,grp:00,time:0xac,magic:0x00ac] CAR<7:5>|BIKE<4:0>,orig:0x8c,new:0x97

字符串 2:

[impro:0,grp:00,time:0xbc,magic:0x00bc] CAKE<4:0>,orig:0x0d,new:0x17

在字符串 1 中,我想提取 CAR<7:5BIKE<4:0

在字符串 2 中,我想提取 CAKE<4:0

Python 中是否有正则表达式?

您可以使用\w+<[^>]+

DEMO

  • \w 匹配任意单词字符(相当于[a-zA-Z0-9_])
  • +匹配前一个token,次数在1次到无限次之间,尽可能多次,按需回馈(贪心)。
  • < 匹配字符 <
  • [^>] 匹配列表中不存在的单个字符
  • +匹配前一个token,次数在1次到无限次之间,尽可能多次,按需回馈(贪心)

我们可以在这里使用 re.findall 模式 (\w+.*?)>:

inp = ["[impro:0,grp:00,time:0xac,magic:0x00ac] CAR<7:5>|BIKE<4:0>,orig:0x8c,new:0x97", "[impro:0,grp:00,time:0xbc,magic:0x00bc] CAKE<4:0>,orig:0x0d,new:0x17"]
for i in inp:
    matches = re.findall(r'(\w+<.*?)>', i)
    print(matches)

这会打印:

['CAR<7:5', 'BIKE<4:0']
['CAKE<4:0']

在第一个示例中,BIKE 部分没有前导 space,而是一个管道字符。

更精确的匹配可能是在左侧断言 space 或管道,匹配以冒号分隔的数字并在右侧断言 >。

(?<=[ |])[A-Z]+<\d+:\d+(?=>)

在部分中,模式匹配:

  • (?<=[ |]) 正面回顾,断言 space 或管道直接向左
  • [A-Z]+ 匹配 1+ 个字符 A-Z
  • <\d+:\d+ 匹配 <:
  • 之间的 1+ 个数字
  • (?=>)正向前瞻,直接向右断言>

Regex demo

或捕获组变体:

(?:[ |])([A-Z]+<\d+:\d)>

Regex demo