如何提取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:5
和 BIKE<4:0
,
在字符串 2 中,我想提取 CAKE<4:0
Python 中是否有正则表达式?
您可以使用\w+<[^>]+
- \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+ 个数字
(?=>)
正向前瞻,直接向右断言>
或捕获组变体:
(?:[ |])([A-Z]+<\d+:\d)>
字符串 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:5
和 BIKE<4:0
,
在字符串 2 中,我想提取 CAKE<4:0
Python 中是否有正则表达式?
您可以使用\w+<[^>]+
- \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+ 个数字
(?=>)
正向前瞻,直接向右断言>
或捕获组变体:
(?:[ |])([A-Z]+<\d+:\d)>