python中的字典键是RegExp

python中的字典键是RegExp,python,regex,Python,Regex,我需要创建一个字典,其中键是regexp。我想用不同的键比较一个值。例如,我希望这些键具有相同的值: int(1), int(2) ... int(10) 并不是每个人都可以创建键,我需要一个正则表达式来表示所有可能的键。我该怎么做 字典的近似示例: dict = {'int([0-9]*)': 128, 'tinyint([0-9]*)': 64} 我可以不骑自行车吗 我检查MYSQL中是否未达到限制值。字段的限制-始终相同。类型字段可以是int(1)、int(2)…int(11) 我从

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

int(1), int(2) ... int(10) 
并不是每个人都可以创建键,我需要一个正则表达式来表示所有可能的键。我该怎么做

字典的近似示例:

dict = {'int([0-9]*)': 128, 'tinyint([0-9]*)': 64}
我可以不骑自行车吗

我检查MYSQL中是否未达到限制值。字段的限制-始终相同。类型字段可以是
int(1)、int(2)…int(11)

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

type_字段=(u'number',u'int(10)”,u'NO',u'PRI',None,u'auto_increment')

>>打印类型\字段[1]

int(10)

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

di[type_字段[1]]


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

不需要使用正则表达式,您只需在dict理解中使用
格式即可:

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

>>> val_list=['a','b','c','d']
>>> {'int({})'.format(i):j for i,j in zip(range(1,len(val_list)+1),val_list)}
{'int(1)': 'a', 'int(4)': 'd', 'int(2)': 'b', 'int(3)': 'c'}
如果您字面上是指正则表达式的键,那么它们在Python中是可散列的对象:

>>> {re.compile(r'int([0-9]*)'): 128}
{<_sre.SRE_Pattern object at 0x10cbd6200>: 128}
或者在使用正则表达式之前只使用表示正则表达式的字符串:

>>> 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 ')]
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正则表达式模式可以预编译并存储在您想要的任何位置

因此,创建模式并将其存储为键,然后将数值输出作为值

import re

patt_dict = {
    re.compile('int\([0-9]*\)'): 128,
    re.compile('tinyint\([0-9]*\)'): 64
    }
现在假设您正在从文件中读取一个表create语句

total_size = 0
with open('create_stmt.txt') as sql_fl:
    for line in sql_fl:
        for key, value in patt_dict.iteritems():
            if re.findall(key, line.strip()):
                total_size += value
print total_size

请记住,这是一个O(n*m)算法。我还不知道如何使它更快。

谢谢大家。我喜欢这样:

limits = {'tinyint': 127, 'tinyint unsigned': 255}
field_autoincrement = ('zxzxzxz', 'tinyint(4) unsigned', 'dsdsds')
limit = limits[re.compile('\(\d+\)').sub('', field_autoincrement[1])]
>>>limit
255

我不完全理解你的问题,你能提供一些测试用例吗?向我们展示这个输入的样本输入和预期输出。dict值的含义是什么?它们来自哪里?你是如何向dict添加数据的?你可能想做你自己的预处理哈希函数来首先获得一个密钥。这与位掩码有关吗?你是说n环球飞行?比如
可能吗?
是的,当然可能。如果他们能把一个人送上月球……似乎空间效率很低,因为它似乎有很多键映射到同一个值。@C.B.那么你的建议呢?我的评论中概述了这个想法,但我同意Nsh的观点,需要更多的上下文。为了增加可用性,请编写一个custom
RegexDict
这将为您做到这一点:
\uu getitem\uuuuuuuuuuu(self,index):如果k.search(index)为self中的k返回[di[k]
。您可能需要实现足够多的
dict
接口来使用
集合。可变映射
limits = {'tinyint': 127, 'tinyint unsigned': 255}
field_autoincrement = ('zxzxzxz', 'tinyint(4) unsigned', 'dsdsds')
limit = limits[re.compile('\(\d+\)').sub('', field_autoincrement[1])]
>>>limit
255