Python在字符串'function(parameter)'中获取参数

时间:2018-10-27 08:35:23

标签: python string list dictionary

我试图获取MySQL列的类型,并以python中的字符串形式检索它们。它们不是真正的函数,而是可以签名或不能签名的数据类型。

示例:

someString = 'bigint(20)'

需要字符串someString

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

如果类型没有具体限制或无法签名

someString = 'text'

需要字符串someString

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

2 个答案:

答案 0 :(得分:1)

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

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

请注意,如果您经常需要正则表达式,则可能需要对其进行预编译。请参阅Python's builtin regular expression module的文档。


如果要避免使用正则表达式,也可以使用字符串方法。这使您可以逐步划分和剥离输入:

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

答案 1 :(得分:1)

此处要注意的重要一点是bigint(20)表示一个8字节整数,显示时将填充为20个字符的长度,而 not 20个字节的整数。

您可以使用cursor属性通过使用descrption对象来轻松获取此信息。它提供有关最后执行的查询的列类型的元信息。例如。

from mysql.connector import FieldType

cursor = ...    

cursor.execute("<some query>")
rows = cursor.fetchall()

for desc in cursor.description:
    col_name = desc[0]
    col_type = desc[1] # would be a number representing bigint in your case
    col_display_length = desc[2] # would be 20 in your case
    col_internal_size = desc[3] # number of bytes used to store the field (8 for bigint)
    print("Column {} has type {} with width {}".format(
        col_name, 
        FieldType.get_info(col_type), # convert the number to type information
        col_display_length
    ))

您可以在此处找到有关说明内容的更多信息:https://www.python.org/dev/peps/pep-0249/#cursor-attributes