正则表达式开始于并结束于

时间:2021-06-11 08:35:33

标签: python regex

我有这个字符串:

[project_machine 332800MB 256256MB 23%                    
project_machine2 665600MB 512512MB 23%]

我想只取机器的名字,取这样的东西:

project_machine project_machine2

为了做到这一点,我尝试使用正则表达式和类似的东西:

^ 用于选择字符串的开头 $ 用于选择字符串的结尾(我认为,在这里,空格可以解决问题)

^project+$\s

但它不匹配。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

如果这实际上是一个字符串,那么它包含换行符。您可以将它们分开以使其更容易并避免使用正则表达式。

s = """[project_machine 332800MB 256256MB 23%                    
project_machine2 665600MB 512512MB 23%]"""

m = []
for machine in s[1:-1].split('\n'):
   m.append(machine.split()[0])

machines_str = ' '.join(m)

这超出了我的脑海 - 应该可以工作......

说明:

  • s[1:-1] 正在去掉第一个和最后一个位置的方括号。
  • split('\n') 在换行符处拆分以创建字符串列表
  • 启动一个列表并添加每一行的第一个值(机器名称)(这里的拆分是在一个空格上拆分,这是 split 的默认值)
  • 加入此列表以获取您想要的字符串

我最初是用一个更复杂的列表理解来做这个的,但我认为这里的循环更清晰,更容易理解发生了什么。

答案 1 :(得分:1)

对于这样的事情,我真的很喜欢使用 https://regex101.com/ 进行测试。因为您可能不知道您的字符串是否包含数字,所以您应该在表达式中指明。此外,您的第一行不是以“project_manager”开头,而是以“[”开头。如果你只想要机器的名字,你不需要指定以它开头的字符串,只需提取术语:

project_machine\d*

\d 匹配一个数字(相当于 [0-9])
* 在零次和无限次之间匹配前一个令牌,尽可能多次,根据需要回馈(贪婪)

答案 2 :(得分:1)

project+ 表示 projec 后跟一个或多个 t。考虑到您想在 [ 之后获得匹配而不是跨越到行尾 ^$ 是此任务的错误工具。我建议以下方式:

import re
text = '''[project_machine 332800MB 256256MB 23%                    
project_machine2 665600MB 512512MB 23%]'''
machines = re.findall(r'project\S+', text)
print(machines)

输出

['project_machine', 'project_machine2']

说明:获取 project 后跟任何非空格 (\S)。注意使用所谓的原始字符串以使转义更容易。有关 re 模块使用原始字符串的讨论,请参阅 re docs

相关问题