Regex在子字符串之前捕获所有

2024-10-02 16:28:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串:

s = 'Abc - 33 SR 11 Kill(s) P G - (Type-1P-G) 2 Kill(s) M 1 Kill(s) S - M9A CWS 1 Kill(s) 11 Kill(s)'

我试图将其拆分以捕获杀死的数量,以及每个"XY Kill(s)"之前的信息以获得此输出:

['Abc - 33 SR', 
 'P G - (Type-1P-G)', 
 'M', 
 'S - M9A CWS']

获得死亡人数很简单:

re.findall(r"(\d+) Kill", s)
['11', '2', '1', '1', '11']

获取文本变得更加困难。通过研究,我尝试使用以下正则表达式,这只是一系列捕获组的开始:

re.findall(r"(?=[0-9]+ Kill)", s)
['', '', '', '', '', '', '']

然后我把它改成了在“每个组之前添加任意数量的字符”。你知道吗

re.findall(r"(.+)(?=[0-9]+ Kill)", s)
['Abc - 33 SR 11 Kill(s) P G - (Type-1P-G) 2 Kill(s) M 1 Kill(s) S - M9A CWS 1 Kill(s) 1']

这只是给出了整个字符串。在“任意数字的空间杀死”之前,我如何调整它来捕获所有的东西?你知道吗

让我们把受骗者赶走。我参考了以下内容。第二个看起来特别有用,但我一直无法使它适合这个目的。你知道吗

Extract Number before a Character in a String Using Python

How would I get everything before a : in a string Python

how to get the last part of a string before a certain character?。你知道吗


Tags: 字符串inreget数量stringtypekill
2条回答

你可以用

re.findall(r'(.*?)\s*(\d+) Kill\(s\)\s*', s)

参见regex demo

细节

  • (.*?)-捕获组1:除换行符以外的任何0+个字符,尽可能少
  • \s*-0+空格
  • (\d+)-捕获组2:一个或多个数字
  • Kill(s)-一个空间和Kill(s)子串
  • \s*-0+空格

Python demo

import re
rx = r"(.*?)\s*(\d+) Kill\(s\)\s*"
s = "Abc - 33 SR 11 Kill(s) P G - (Type-1P-G) 2 Kill(s) M 1 Kill(s) S - M9A CWS 1 Kill(s) 11 Kill(s)"
print(re.findall(rx, s))

输出:

[('Abc - 33 SR', '11'), ('P G - (Type-1P-G)', '2'), ('M', '1'), ('S - M9A CWS', '1'), ('', '11')]

您可以使用^{}来获得匹配之间的所有内容的列表。你知道吗

>>> re.split(r"\d+ Kill\(s\)", s)
    ['Abc - 33 SR ', ' P G - (Type-1P-G) ', ' M ', ' S - M9A CWS ', ' ', '']

您可以清理它以删除空白和空字符串。你知道吗

>>> [s.strip() for s in re.split(r"\d+ Kill\(s\)", s) if s.strip()]
    ['Abc - 33 SR', 'P G - (Type-1P-G)', 'M', 'S - M9A CWS']

相关问题 更多 >