python - Python在字符串'function(parameter)'中获取参数
问题描述
我正在尝试获取 MySQL 列的类型,并在 python 中将它们作为字符串检索。它们不是真正的函数,而是可以签名或不可以签名的数据类型。
例子:
someString = 'bigint(20)'
需要从字符串someString
:
datatype = {'type': 'bigint', 'length': 20 }
如果类型没有指定限制或无法签名
someString = 'text'
需要从字符串someString
:
datatype = {'type': 'bigint', 'length': None }
解决方案
正则表达式可以直接提取你描述的字段:
>>> 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
推荐阅读
- r - 如何仅提取R中正则表达式中的捕获组
- python - 在不知道该符号编码的情况下,从包含符号的字符串中,如何显示完整的字符串以避免出现错误?
- google-bigquery - Firebase 自动删除 BigQuery 表中记录的服务器事件
- javascript - 使用 setState 从 useState() 钩子传递
- javascript - 嵌套渲染不影响 DOM
- n1ql - 下面的查询需要 2 分钟,是否可以进一步调整
- java - 从日历周到 java.time.ZonedDateTime
- python - 有没有一种方法可以创建变量来存储数据库中列的值,而无需在 pymysql 中多次执行相同的查询?
- docker - Laravel 与 Docker:测试时选择了错误的数据库
- mysql - 更改 FK 引用列中的自动增量属性