Python重新匹配单词中的字母

时间:2017-06-27 13:13:51

标签: python regex python-2.x

我是Python的新手,但我需要帮助。我在这里搜索,google,文档,但没有任何效果。所以这就是我想要做的。

我有词(例如)" string" 然后我有单词列表:

  

字符串,字符串,str,ing,in,ins,rs,stress

我希望匹配如下: string,str,ing,in,ins,rs。

我不想匹配:压力,字符串(因为有2x s,而在单词字符串中,只有1)

  • 只需匹配单词 string
  • 中的字母

抱歉英语不好,如果我解释得不够好。

是的,而且,有些字母是unicode。

4 个答案:

答案 0 :(得分:3)

我认为你不能用正则表达式做到这一点,但我认为你可以用collections来做到这一点:

>>> from collections import Counter
>>> target = "string"
>>> words = ["strings", "string", "str", "ing", "in", "ins", "rs", "stress"]
>>> [word for word in words if not Counter(word) - Counter(target)]
['string', 'str', 'ing', 'in', 'ins', 'rs']

答案 1 :(得分:1)

正则表达式可能不是最佳解决方案。这是一种算法:

  • 制作目标词的词典,每个字母为一个键,值(s)为该词中该字母的数量。例如对于strings的键:值对将为{'s':1}
  • 对于您要测试的每个单词,检查每个字母是否在字典中,并且字母数不超过目标字中的计数。

答案 2 :(得分:1)

根据问题的精神,这是一个正则表达式的答案。

Here's the regex可以玩。

这是^(?=[string]{1,6}$)(?!.*(.).*\1).*$

这将检查string内的1-6个字符。 下半部分确保没有重复。 当然,如果你的原始sstring中有多个相同的字符,这种方法就会崩溃,而且对于长字符串来说它并不是特别有效。

为通用输入词运行它的代码:

import re
mylist = ["strings", "string", "str", "ing", "in", "ins", "rs", "stress"]
word = "string"
r = re.compile("^(?=[%s]{1,%d}$)(?!.*(.).*\1).*$" % (word, len(word)))
print filter(r.match, mylist)

打印:

  

['string','str','ing','in','ins','rs']

您可以使用代码here

答案 3 :(得分:0)

我认为你完全不需要使用Python。如果我理解你很好,你只想得到字母不能重复的字样。

这个问题可以通过以下两行Python代码来解决。

str_list = [u'strings', u'string', u'str', u'ing', u'in', u'ins', u'rs', u'stress']
new_list = [i for i in str_list if len(set(i)) == len(i) ]
print new_list

该计划的输出是:

[u'string', u'str', u'ing', u'in', u'ins', u'rs']

对于unicode字符串,必须使用unicode字符串类或代码页。你不能使用utf-8表示法。 函数set从可迭代对象创建唯一集。可迭代对象也是字符串。删除重复的字母。如果删除某些内容,则其长度不能与原始字符串相同。