您可以使用\d 正则表达式模式匹配数字,使用\D 模式匹配非数字字符。您还需要在要捕获的组周围加上括号,以便 match 或 findall 将返回这些组。
import re
s = "VOLUME 26 4—PART 23"
pattern = re.compile('VOLUME (\d+) (\d+)—PART (\d+)')
print(pattern.findall(s))
如果您不确定 VOLUME 和 PART 是否始终相同,您可以改用这个更通用的模式:
pattern = re.compile('\D+(\d+) (\d+)\D+(\d+)')
运行任一模式打印:
[('26', '4', '23')]
要将结果提取到您的变量中,请将print() 行替换为:
result = pattern.findall(s)[0]
volume, epitome, part = (int(i) for i in result)
与可选的缩影匹配
您可以通过将中间项目(缩影)包装在非捕获组(?:...) 中来使其成为可选。在此之后使用? 告诉它匹配 0 或 1 次出现,它适用于有或没有缩影的行。如果缺少缩影,result 元组中的第二个元素将是一个空字符串''。
下面是工作示例:
import re
sl = ["VOLUME 26 4—PART 23", "VOLUME 16 4-PART 7", "VOLUME 12-PART 38"]
pattern = re.compile('\D+(\d+)(?: (\d+))?\D+(\d+)')
for s in sl:
result = pattern.findall(s)[0]
volume, epitome, part = (int(i) if i else i for i in result)
print('"{}": v {}, e {}, p {}'.format(s, volume, epitome, part))
运行它会产生:
"VOLUME 26 4—PART 23": v 26, e 4, p 23
"VOLUME 16 4-PART 7": v 16, e 4, p 7
"VOLUME 12-PART 38": v 12, e , p 38