python中的字典键是RegExp

2024-05-17 14:02:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要创建一个字典,其中的键将是一个regexp。我想用不同的键比较一个值。例如,我希望这些键的值相同:

int(1), int(2) ... int(10) 

这并不是每个人都可以创建键,我需要为所有可能的键使用一个正则表达式。我该怎么做?在

字典的近似示例:

^{pr2}$

我可以不用自行车吗?在

我检查MYSQL中没有达到限制值。字段限制-始终相同。类型字段可以是int(1), int(2)...int(11)

我从MYSQL值得到tuple中字段的类型:

type_field = (u'number ', u'int (10)', u'NO ', u'PRI', None, u'auto_increment ')

以及

>>> print type_field[1]

int (10)

我想通过键type_field[1]直接调用字典的值,而不需要循环。像这样:

di[type_field[1]]

对于int(number)中从1到11的任何数字,我都会收到相同的值。有可能吗?在


Tags: nonone示例类型numberfield字典type
3条回答

不需要使用regex您只需在dict理解中使用format

{'int({})'.format(i):j for i,j in zip(range(1,len(val_list)+1),val_list)}

示例:

^{pr2}$

如果您的意思是regex的,那么它们在Python中是散列对象:

>>> {re.compile(r'int([0-9]*)'): 128}
{<_sre.SRE_Pattern object at 0x10cbd6200>: 128}

也就是说你可以做一些类似的事情:

^{pr2}$

或者在使用正则表达式之前使用表示正则表达式的字符串:

>>> di={r'^\w\w?a': '"a" is second or third letter' , r'^[^aeiou][aeiou]': "vowel after non-vowel"}
>>> for s in ('aaa', 'bag', 'box', 'drag'):
...     print s, [di[k] for k in di if re.search(k, s)]
... 
aaa ['"a" is second or third letter']
bag ['vowel after non-vowel', '"a" is second or third letter']
box ['vowel after non-vowel']
drag ['"a" is second or third letter']

根据您的更新,我觉得您需要的是列表理解:

li=[
(u'number ', u'int (10)', u'NO ', u'PRI', None, u'auto_increment '),
(u'number ', u'int (22)', u'NO ', u'PRI', None, u'auto_increment '),
(u'number ', u'int (11)', u'NO ', u'PRI', None, u'auto_increment '),
]

>>> [e for e in li if 1<int(re.search(r'\((\d+)\)$', str(e[1])).group(1))<11]
[(u'number ', u'int (10)', u'NO ', u'PRI', None, u'auto_increment ')]

除此之外,您可能需要创建一个类来执行更专门的操作。从你所描述的情况来看,我认为你还需要仔细考虑一下细节。在

正则表达式模式可以预先编译并存储在任何需要的地方。在

所以创建模式并将它们存储为键,然后将数值输出作为值。在

import re

patt_dict = {
    re.compile('int\([0-9]*\)'): 128,
    re.compile('tinyint\([0-9]*\)'): 64
    }

现在假设您正在从文件中读取table create语句

^{pr2}$

请记住,这是一个O(n*m)算法。我还不知道怎样才能更快。在

相关问题 更多 >