我有一个像这样的字符串:
str = "something move 11 something move 12 something 13 copy 14 15"
其中“某物”表示一些文本,或者根本没有文本。
因此我想要一个像这样的列表:
[('move', 11, ''), ('move', 12, 13), ('copy', 14, 15)]
我尝试使用这个:
re.findall('(move|copy).+?([0-9]+).+?([0-9]+)*', str)
但它给出了我的输出:
[('move', 11, ''), ('move', 12, ''), ('copy', 14, '')]
我知道这是因为最后一个数字是可选的,但我只是不知道它如何才能工作。
我该怎么做?
最佳答案
基于@Ashwini Chaudhary's answer :
#!/usr/bin/env python
import re
commands = "copy move".split()
input_string = "something move 11 something move 12 something 13 copy 14 15"
tokens = iter(re.split("(%s)" % "|".join(map(re.escape, commands)), input_string))
result = []
for tok in tokens:
if tok in commands:
args = re.findall(r"\d+", next(tokens, ""))
result.append((tok,) + tuple(args) + ("",)*(2 - len(args)))
print(result)
Output
[('move', '11', ''), ('move', '12', '13'), ('copy', '14', '15')]
要将每个命令限制为两个参数,只需使用切片:tuple(arg[:2])
。
关于python - 使用正则表达式和 python 解析命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14489010/