首页 > 解决方案 > Python在字符串'function(parameter)'中获取参数

问题描述

我正在尝试获取 MySQL 列的类型,并在 python 中将它们作为字符串检索。它们不是真正的函数,而是可以签名或不可以签名的数据类型。

例子:

someString = 'bigint(20)'

需要从字符串someString

datatype = {'type': 'bigint', 'length': 20 }

如果类型没有指定限制或无法签名

someString = 'text'

需要从字符串someString

datatype = {'type': 'bigint', 'length': None }

标签: pythonstringlistdictionary

解决方案


正则表达式可以直接提取你描述的字段:

>>> re.match(r'^(?P<type>[^(]+)(?:\((?P<length>\d+)\))?$', 'bigint(20)').groupdict()
{'type': 'bigint', 'length': '20'}
  • ^$匹配字符串的开头和结尾。
  • (?P<type>...+)捕获一个名为type
    • [^(]+匹配一个或多个不是 (
  • (?:\(...\))?匹配括号中的可选组
    • (?P<length>...)捕获一个名为length
      • \d+ 匹配一位或多位数字

请注意,如果您经常需要,您可能需要预编译正则表达式。请参阅Python 的内置正则表达式模块的文档。


如果要避免使用正则表达式,还可以使用字符串方法。这允许您逐步对输入进行分区和剥离:

def parse_type(literal):
    name, _, length = literal.partition('(')
    if not length:
        return {'type': name, 'length': None}
    return {'type': name, 'length': length.strip(')')}

这以速度和健壮性与可读性为代价。


请注意,在这两种情况下,您都会得到length字符串,而不是整数。您必须明确转换它:

result = parse_type('bigint(20)')
result['length'] = int(result['length']) if result['length'] is not None else None

推荐阅读