Mal*_*res 7 python regex validation cpu-word
我有一个单词的词典(实际上我已经嵌套了动词变形的词组,但这没有关系)我希望通过组合它们来制作一个正则表达式.
{
'yo': 'hablaba',
'tú': 'hablabas',
'él': 'hablaba',
'nosotros': 'hablábamos',
'vosotros': 'hablabais',
'ellos': 'hablaban',
'vos': 'hablabas',
}
Run Code Online (Sandbox Code Playgroud)
......制作:
'habl((aba(s|is|n)?)|ábamos)' # I think that's right
Run Code Online (Sandbox Code Playgroud)
如果我不包括'hablábamos'
它很容易 - 它们都是相同的前缀,我可以得到:
'hablaba(s|is|n)?'
Run Code Online (Sandbox Code Playgroud)
......但我想要一般形式.那可能吗?
是的,我相信这是可能的.
为了帮助您入门,我将解决这个问题.
通过查找与所有拒绝值的开头匹配的最长字符串来计算根:
>>> root = ''
>>> for c in hablar['yo']:
... if all(v.startswith(root + c) for v in hablar.itervalues()):
... root += c
... else:
... break
...
>>> root
'habl'
Run Code Online (Sandbox Code Playgroud)
无论剩下的是什么,都会产生list
一些结局.
>>> endings = [v[len(root):] for v in hablar.itervalues()]
>>> print endings
['abas', 'aba', 'abais', 'aba', '\xc3\xa1bamos', 'aban', 'abas']
Run Code Online (Sandbox Code Playgroud)
然后,您可能希望清除重复项:
>>> unique_endings = set(endings)
>>> print unique_endings
set(['abas', 'abais', '\xc3\xa1bamos', 'aban', 'aba'])
Run Code Online (Sandbox Code Playgroud)
然后将这些结尾与管道连接起来:
>>> conjoined_endings = '|'.join(unique_endings)
>>> print conjoined_endings
abas|abais|ábamos|aban|aba
Run Code Online (Sandbox Code Playgroud)
形成正则表达式是一个简单的事情,它将括号中的root和conjoined_endings字符串组合在一起:
>>> final_regex = '{}({})'.format(root, conjoined_endings)
>>> print final_regex
habl(abas|abais|ábamos|aban|aba)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1217 次 |
最近记录: |