我有这个字符串:
[project_machine 332800MB 256256MB 23%
project_machine2 665600MB 512512MB 23%]
我想只取机器的名字,取这样的东西:
project_machine project_machine2
为了做到这一点,我尝试使用正则表达式和类似的东西:
^ 用于选择字符串的开头 $ 用于选择字符串的结尾(我认为,在这里,空格可以解决问题)
^project+$\s
但它不匹配。
我做错了什么?
答案 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。