如何从单词列表创建regex?

2024-09-29 01:27:38 发布

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

我有一个单词的dict(实际上我有动词变化的嵌套dict,但这不相关),我想通过组合它们来生成regex。在

{
  'yo': 'hablaba',
  'tú': 'hablabas',
  'él': 'hablaba',
  'nosotros': 'hablábamos',
  'vosotros': 'hablabais',
  'ellos': 'hablaban',
  'vos': 'hablabas',
}

。。。使:

^{pr2}$

如果不包括'hablábamos'这很简单-它们都是相同的前缀,我可以得到:

'hablaba(s|is|n)?'

。。。但我想要一个通用表格。有可能吗?在


Tags: 单词dictregexyopr2vosbamoshabl
2条回答

我认为你需要一个不那么聪明的方法

>>> x={
...   'yo': 'hablaba',
...   'tú': 'hablabas',
...   'él': 'hablaba',
...   'nosotros': 'hablábamos',
...   'vosotros': 'hablabais',
...   'ellos': 'hablaban',
...   'vos': 'hablabas',
... }
>>> x
{'t\xc3\xba': 'hablabas', 'yo': 'hablaba', 'vosotros': 'hablabais', '\xc3\xa9l': 'hablaba', 'nosotros': 'habl\xc3\xa1bamos', 'ellos': 'hablaban', 'vos': 'hablabas'}
>>> x.values
<built-in method values of dict object at 0x20e6490>
>>> x.values()
['hablabas', 'hablaba', 'hablabais', 'hablaba', 'habl\xc3\xa1bamos', 'hablaban', 'hablabas']
>>> "|".join(x.values())
'hablabas|hablaba|hablabais|hablaba|habl\xc3\xa1bamos|hablaban|hablabas'

如果你只是用一个交替操作符来连接散列值,那么它应该做你想要的

是的,我相信这是可能的。在

为了让你开始,这就是我要解决的问题。在

通过查找与所有拒绝值的开头匹配的最长字符串来计算根:

>>> root = ''
>>> for c in hablar['yo']:
...     if all(v.startswith(root + c) for v in hablar.itervalues()):
...         root += c
...     else:
...        break
... 
>>> root
'habl'

单词的剩余部分构成了一个list的结尾。在

^{pr2}$

然后,您可能需要剔除重复项:

>>> unique_endings = set(endings)
>>> print unique_endings
set(['abas', 'abais', '\xc3\xa1bamos', 'aban', 'aba'])

然后用管道将这些末端连接在一起:

>>> conjoined_endings = '|'.join(unique_endings)
>>> print conjoined_endings
abas|abais|ábamos|aban|aba

形成正则表达式是一个简单的问题,它将根和括号中的连接结尾字符串结合起来:

>>> final_regex = '{}({})'.format(root, conjoined_endings)
>>> print final_regex
habl(abas|abais|ábamos|aban|aba)

相关问题 更多 >