我一直在使用以下 python 代码将整数部分 ID 格式化为格式化的部分编号字符串:
pn = 'PN-{:0>9}'.format(id)
我想知道是否有一种方法可以'PN-{:0>9}'
反向使用相同的格式字符串 () 从格式化的零件编号中提取整数 ID。如果无法做到这一点,有没有办法使用单个格式字符串(或正则表达式?)来创建和解析?
我一直在使用以下 python 代码将整数部分 ID 格式化为格式化的部分编号字符串:
pn = 'PN-{:0>9}'.format(id)
我想知道是否有一种方法可以'PN-{:0>9}'
反向使用相同的格式字符串 () 从格式化的零件编号中提取整数 ID。如果无法做到这一点,有没有办法使用单个格式字符串(或正则表达式?)来创建和解析?
解析模块“与格式()相反”。
示例用法:
>>> import parse
>>> format_string = 'PN-{:0>9}'
>>> id = 123
>>> pn = format_string.format(id)
>>> pn
'PN-000000123'
>>> parsed = parse.parse(format_string, pn)
>>> parsed
<Result ('123',) {}>
>>> parsed[0]
'123'
您可能会发现模拟 scanf很有趣。
如果您不想使用 parse 模块,这里有一个解决方案。它将格式字符串转换为具有命名组的正则表达式。它做了一些假设(在文档字符串中描述)在我的情况下是可以的,但在你的情况下可能不行。
def match_format_string(format_str, s):
"""Match s against the given format string, return dict of matches.
We assume all of the arguments in format string are named keyword arguments (i.e. no {} or
{:0.2f}). We also assume that all chars are allowed in each keyword argument, so separators
need to be present which aren't present in the keyword arguments (i.e. '{one}{two}' won't work
reliably as a format string but '{one}-{two}' will if the hyphen isn't used in {one} or {two}).
We raise if the format string does not match s.
Example:
fs = '{test}-{flight}-{go}'
s = fs.format('first', 'second', 'third')
match_format_string(fs, s) -> {'test': 'first', 'flight': 'second', 'go': 'third'}
"""
# First split on any keyword arguments, note that the names of keyword arguments will be in the
# 1st, 3rd, ... positions in this list
tokens = re.split(r'\{(.*?)\}', format_str)
keywords = tokens[1::2]
# Now replace keyword arguments with named groups matching them. We also escape between keyword
# arguments so we support meta-characters there. Re-join tokens to form our regexp pattern
tokens[1::2] = map(u'(?P<{}>.*)'.format, keywords)
tokens[0::2] = map(re.escape, tokens[0::2])
pattern = ''.join(tokens)
# Use our pattern to match the given string, raise if it doesn't match
matches = re.match(pattern, s)
if not matches:
raise Exception("Format string did not match")
# Return a dict with all of our keywords and their values
return {x: matches.group(x) for x in keywords}
怎么样:
id = int(pn.split('-')[1])
这会在破折号处拆分零件编号,获取第二个组件并将其转换为整数。
PS我保留id
了变量名,以便与您的问题的联系很清楚。重命名不会影响内置函数的变量是个好主意。