正则表达式中的模式匹配

时间:2017-09-21 09:04:55

标签: python regex dictionary

我在下面的字典中创建的密钥是值的长度。

typeof(PhotoFilterHandler).BaseType.Name

我想在这个词典中提取一个值列表,使得元音在5个单词的同一个地方出现 [丢失,欲望,列表,最后,以免],[遮挡,搅拌机,的Blonder,大错,乏味]]

我对如何以这种方式获取列表一无所知。我认为可以通过正则表达式的一种方式,但我在什么基础上匹配?单词的长度可以是任何东西,元音可以是任何地方。

PS这是一个代码问题。 https://www.codewars.com/kata/vowel-alternations/train/python 到目前为止,我的方法是在字典中获取相同长度的值,以便我可以处理值。我根本不知道如何处理这些价值观。 如果有人能够解释我们在想什么以及最好的方法是什么,那将会很有帮助。

代码的其余部分

{4: {'lost', 'lust', 'list', 'last', 'lest', 'blue'}, 5: {'beryl'}, 8: {'blowlamp', 'blimbing', 'bluejays', 'jigsawed'}, 9: {'blistered', 'oospheres', 'blackcaps', 'blastular', 'blotchier', 'troweller'}, 10: {'blancmange', 'blackguard', 'volcanizes'}, 6: {'blague', 'blacks', 'blonde', 'blocks'}, 7: {'blawort', 'blinder', 'blender', 'blonder', 'blunder', 'blander'}}

5 个答案:

答案 0 :(得分:0)

您可以检查元音位置的第一个字符串,并生成要匹配的正则表达式字符串。每个字母映射到'[aeiou]'或'。'取决于它是否是元音。你为什么选择'y'取决于你。

答案 1 :(得分:0)

假设您只想在输出列表包含5个单词时打印出来:

text = {4: {'lost', 'lust', 'list', 'last', 'lest', 'blue'}, 5: {'beryl'}, 8: {'blowlamp', 'blimbing', 'bluejays', 'jigsawed'}, 9: {'blistered', 'oospheres', 'blackcaps', 'blastular', 'blotchier', 'troweller'}, 10: {'blancmange', 'blackguard', 'volcanizes'}, 6: {'blague', 'blacks', 'blonde', 'blocks'}, 7: {'blawort', 'blinder', 'blender', 'blonder', 'blunder', 'blander'}}
vowels = "aeiou"
for i in range(4,10):
        words = text[i]
        rep_idx = []
        for word in words:
            for letter in vowels:
                if letter in word:
                    idx = word.index(letter)
                    if idx not in rep_idx:
                        word_list = []
                        for word in words:
                            if word[idx] in vowels:
                                word_list.append(word)
                        if len(word_list) == 5:
                            print ("{}, Vowel Index: {}".format(word_list, idx))
                    rep_idx.append(idx)

输出:

>>> 
['lust', 'lest', 'list', 'lost', 'last'], Vowel Index: 1
['blonder', 'blender', 'blinder', 'blander', 'blunder'], Vowel Index: 5
['blistered', 'blackcaps', 'troweller', 'blastular', 'blotchier'], Vowel Index: 2
['blistered', 'troweller', 'oospheres', 'blastular', 'blotchier'], Vowel Index: 7

答案 2 :(得分:0)

以下代码是接近它的一种方式的开始:

#!/usr/bin/python
import re

words = 'last lest best list '.split()
words1 = 'blander wigwam blunder slender'.split()

print("word list one: {}".format(words))
print('')
aoa = [re.split('[aeiou]', word) for word in words]
for item in aoa:
    print(item)

print('\n')

print("word list two: {}".format(words1))
print('')
aoa1 = [re.split('[aeiou]', word) for word in words1]
for item in aoa1:
    print(item)

输出是:

word list one: ['last', 'lest', 'best', 'list']

['l', 'st']
['l', 'st']
['b', 'st']
['l', 'st']


word list two: ['blander', 'wigwam', 'blunder', 'slender']

['bl', 'nd', 'r']
['w', 'gw', 'm']
['bl', 'nd', 'r']
['sl', 'nd', 'r']

正则表达式在元音上分裂。如果仔细查看拆分的输出,您会注意到对于应匹配的单词,相应的列表索引值是相同的。也许您可以遍历列表并进行比较。

这取决于你...

答案 3 :(得分:0)

好的,对于代码问题问题(我采取了与你不同的方法,所以我没有使用你的代码):

首先,您定义一个简单的函数,更改某些(这里是一个美元符号)字符的所有元音:

from collections import Counter
def translate(word):
    for ch in 'eyuioa':
        if ch in word:
            word=word.replace(ch,'$')
    return word

然后你定义一个函数,它将单词列表作为输入(例如['last','lest','list','lost','lust']))来计算每个翻译单词的出现次数,并找到发生5次的翻译单词。将其存储在列表中并添加[无],以防列表为空(找不到单词),这样就不会出现错误。然后只需打印符合条件的所有单词。

def find_solutions(input_list):
    tuples_list = list(map(lambda x: (x,translate(x)),input_list))
    counting = Counter(map(lambda x: x[1], tuples_list))
    desired_pattern = [x for x,y in dict(counting).items() if y ==5] + [None]
    return  [x for x, y in tuples_list if y==desired_pattern[0]]

示例:

find_solutions(['last', 'lest', 'list', 'lost', 'lust'])

答案 4 :(得分:0)

这将是非常强大的方法,但似乎有效:

puts "=" * 80
puts %x("ls")
puts "=" * 80

if $?.success?
  puts "Success!"
else
  puts "Error happened. Status: #{$?}"
end