正则表达式以开头,以结尾

2024-06-25 23:45:00 发布

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

我有这个字符串:

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

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

project_machine project_machine2

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

^用于选择字符串的开头 $用于选择字符串的结尾(我认为,在这里,空白可以起到作用)

^project+$\s

但它并不匹配

我做错了什么


Tags: 字符串project机器结尾machine名字空白machine2
3条回答

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

project_machine\d*

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

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

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的默认值)
  • 加入此列表以获取所需字符串

我最初是通过更复杂的列表理解来完成的,但我认为这里的循环更清晰,更容易理解正在发生的事情

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

相关问题 更多 >