RegEx用于从字典中检索单词

时间:2019-05-23 11:02:00

标签: regex python-3.x dictionary findall dictionary-comprehension

这是我的代码:它在一个字典中查找,在另一个字典中查找并计算第一个字典的值的分数。

d_score = {k: [0, 0, 0] for k in d_filtered_words.keys()}
for k, v in d_filtered_words.items():
    for word in v:
        if word in dico_lexique:
            print(word, dico_lexique[word]
            d_score[k] = [a + b for a, b in zip(map(int, dico_lexique[word]), d_score[k])]
d_score = {k: list(map(str, v)) for k, v in d_score.items()}

打印结果为:

avoir ['101', '3772', '110']
serrer ['175', '936', '252']
main ['251', '2166', '49']
avoir ['101', '3772', '110']
serrer ['175', '936', '252']
enfant ['928', '1274', '19']
aérien ['354', '769', '39']
affable ['486', '45', '32']
affaire ['46', '496', '104']
agent ['265', '510', '18']
connaître ['448', '293', '29']
rien ['24', '185', '818']
trouver ['387', '198', '31']
être ['225', '328', '44']
emmerder ['0', '23', '493']
rien ['24', '185', '818']
suffire ['420', '35', '56']
mettre ['86', '1299', '67']
multiprise ['314', '71', '0']
abasourdir ['0', '43', '393']
ablation ['75', '99', '353']
abominable ['0', '24', '1170']
être ['225', '328', '44']
seul ['65', '97', '540']
ami ['492', '72', '31']
aimer ['1140', '49', '35']

只需澄清一下: dico_lexique还包含key_word,如:

sabot de Vénus>orchidée;294;76;0
imbuvable>boisson;0;0;509
imbuvable>insupportable;0;0;416
accentuer>intensifier;255;89;4
accentuer>mettre un accent;50;29;30

这些是我在查看dico_lexique中的键时还要考虑的词

d_score的结果是:

{'15': ['1731', '12856', '792'], '44': ['3079', '4437', '2549'], '45': ['75', '166', '1916'], '47': ['7721', '3854', '7259']}

您好,只是为了澄清包含元素'>'的单词也是dico_lexique的一部分,它们不是来自另一个文件。在dico_lexique中,您对一个单词有不同的感觉,并为了区分它,在其后加上“>”。我只在dico_lexique和d_filtered中查找,并且要考虑key_word后跟'>',以便当我在d_filtered_words中看到'serrer'时,代码将检索'serrer'的值以及所有值“ serrer”一词后跟“>”。

d_score = {k: [0, 0, 0] for k in d_filtered_words.keys()}
for k, v in d_filtered_words.items():
    for word in v:
        regex =????
        if word in dico_lexique and if word = re.findall(regex, word)

1 个答案:

答案 0 :(得分:0)

编辑:更新问题后,将使用新版本。

样品数据现在为:

>>> d_filtered_words = {
...    '1': ['avoir', 'main'],
...    '2': ['main', 'serrer', 'posséder'],
... }

>>> dico_lexique = {
...     'avoir': ('101', '3772', '110'),
...     'avoir>posséder': ('91', '2724', '108'),
...     'serrer': ('175', '936', '252'),
...     'main': ('251', '2166', '49'),
... }

您必须先处理dico_lexique才能删除>之后的部分,并按主要词将值分组:

>>> values_by_word = {}
>>> for word, values in dico_lexique.items():
...     main, *_ = word.split(">")
...     values_by_word.setdefault(main, []).append(values)
>>> values_by_word
{'avoir': [('101', '3772', '110'), ('91', '2724', '108')], 'serrer': [('175', '936', '252')], 'main': [('251', '2166', '49')]}

说明:

  • main, *_ = word.split(">")将所有内容保留在可选的>之前,而忽略其余内容(请参见destructuring assignement
  • setdefault创建一个与主词关联的新列表(如果主词不存在)并添加值。

现在,与以下逻辑相同:

>>> def merge_values(tuples):
...     """Sums columns (with a str->int->str conversion)"""
...     return tuple(str(sum(int(v) for v in vs)) for vs in zip(*tuples))

>>> merged_values_by_word = {code:merge_values(tuples) for code, tuples in values_by_word.items()}
>>> merged_values_by_word
{'avoir': ('192', '6496', '218'), 'serrer': ('175', '936', '252'), 'main': ('251', '2166', '49')}

(我将get_values重命名为merge_values,但功能相同。) 您可以将下面的代码与merged_values_by_word而非dico_lexique一起使用。

编辑结束:下面的旧版本作为记录

您混合了两个问题:代码的功能(与单词或单词系列相关的值求和)和解析文件或字符串。

一些代码审查

让我总结一下: *您有dico_lexique可以将一个单词映射到三个值(包含整数的字符串) *您有d_filtered_words可以将代码(“ 15”,“ 44”,...)映射到单词列表。 *您创建了一个字典,将每个映射到代码并在[sum of the value1, sum of the value2, sum of the value2]中出现的单词的代码映射到dico_lexique

首先,如果您始终有三个值,请使用tuple,而不要使用list。我将使用此自定义示例:

>>> d_filtered_words = {
...    '1': ['avoir', 'main'],
...    '2': ['main', 'serrer', 'posséder'],
... }

>>> dico_lexique = {
...     'avoir': ('101', '3772', '110'),
...     'serrer': ('175', '936', '252'),
...     'main': ('251', '2166', '49'),
...     # no posséder here
... }

第二,构建一个将代码映射到三个值列表的字典:

>>> def get_tuples(words):
...     """return the tuples of values for every word in dico_lexique"""
...     return [dico_lexique[word] for word in words if word in dico_lexique]

>>> tuples_by_code = {code:get_tuples(words) for code, words in  d_filtered_words.items()}
>>> tuples_by_code
{'1': [('101', '3772', '110'), ('251', '2166', '49')], '2': [('251', '2166', '49'), ('175', '936', '252')]}

第三,将值“按列”求和。有一个简单的方法可以做到:

>>> tuples = [(1,2,3), (4,5,6)]
>>> tuple(zip(*tuples))
((1, 4), (2, 5), (3, 6))
>>> tuple(map(sum, zip(*tuples)))
(5, 7, 9)

zip函数将每个元组的第一个元素分组,然后将每个元组的第二个元素分组,然后...:您得到“列”,而只需要对它们进行求和。就您而言:

>>> def get_values(tuples):
...     """Sums columns (with a str->int->str conversion)"""
...     return tuple(str(sum(int(v) for v in vs)) for vs in zip(*tuples))

>>> values_by_code = {code:get_values(tuples) for code, tuples in tuples_by_code.items()}
>>> values_by_code
{'1': ('352', '5938', '159'), '2': ('426', '3102', '301')}

您的问题

现在您的问题。想象一下,我有一个具有其他形式的文本文件:

>>> text = """avoir>posséder
... voilé>dissimulé
... voilé>caché"""

您必须解析该文件,并分割>上的每一行以构建字典alternative -> main

>>> main_by_alternative = {a: m for line in text.split("\\n") for m, a in [line.split(">")]}
>>> main_by_alternative
{'posséder': 'avoir', 'dissimulé': 'voilé', 'caché': 'voilé'}

关键思想是在char >上拆分行,以在列表中获取主要形式和替代形式。 for m, a in [line.split(">")]是让m, a = line.split(">")接受dict的技巧。现在,回到get_tuples

>>> def get_tuples(words):
...     """return the tuples of values for every word in dico_lexique"""
...     return [dico_lexique[main_by_alternative.get(word, word)] for word in words if main_by_alternative.get(word, word) in dico_lexique]

有什么新变化?查看:main_by_alternative.get(word, word)。如果退出,它只会得到主要形式,否则便是单词本身。

>>> {code:get_tuples(words) for code, words in  d_filtered_words.items()}
{'1': [('101', '3772', '110'), ('251', '2166', '49')], '2': [('251', '2166', '49'), ('175', '936', '252'), ('101', '3772', '110')]}

代码2现在映射到三个词:“ main”,“ serrer”,“ avoir”(通过“posséder”)。

希望有帮助。我使用了很多dict / list理解来简化它,但如果需要,请不要犹豫,将代码扩展为常规循环。