Python只重新匹配word中的字母
我不熟悉Python re,但我需要帮助。我在这里搜索,谷歌,文档,但什么都没找到。这就是我要做的 我有单词(例如“string” 然后我有单词表: 字符串,字符串,str,ing,in,ins,rs,重音 我想匹配如下:string,str,ing,in,ins,rs 我不想匹配:重音、字符串(因为有2个s,而在单词字符串中只有1个)Python只重新匹配word中的字母,python,regex,python-2.x,Python,Regex,Python 2.x,我不熟悉Python re,但我需要帮助。我在这里搜索,谷歌,文档,但什么都没找到。这就是我要做的 我有单词(例如“string” 然后我有单词表: 字符串,字符串,str,ing,in,ins,rs,重音 我想匹配如下:string,str,ing,in,ins,rs 我不想匹配:重音、字符串(因为有2个s,而在单词字符串中只有1个) 只需匹配单词字符串中的字母即可 对不起,英语不好,如果我解释得不够好的话 是的,而且,有些字母是unicode。我不认为你可以用正则表达式来实现这一点,但我
- 只需匹配单词字符串中的字母即可
是的,而且,有些字母是unicode。我不认为你可以用正则表达式来实现这一点,但我认为你可以用
集合来实现这一点:
>>> 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']
我不认为你能用正则表达式做到这一点,但我认为你能用集合做到这一点:
>>> 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']
正则表达式可能不是最好的解决方案。这里有一个算法:
- 为你的目标单词编一本字典,每个字母都是一个键,值是单词中该字母的数量。e、 g.对于
string
,s
的key:value对将是{'s':1}
- 对于要测试的每个单词,请检查字典中是否有每个字母,并且字母计数不超过目标单词中的计数
正则表达式可能不是最好的解决方案。这里有一个算法:
- 为你的目标单词编一本字典,每个字母都是一个键,值是单词中该字母的数量。e、 g.对于
string
,s
的key:value对将是{'s':1}
- 对于要测试的每个单词,请检查字典中是否有每个字母,并且字母计数不超过目标单词中的计数
我认为您完全不需要使用Python re。如果我能很好地理解你,你只想得到那些字母不能重复的单词
这个问题可以用下面两行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
createunique从iterable对象设置。iterable对象也是字符串。重复的字母将被删除。如果删除某些内容,则长度不能与原始字符串相同。我认为完全不需要使用Python re。如果我能很好地理解你,你只想得到那些字母不能重复的单词
这个问题可以用下面两行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
createunique从iterable对象设置。iterable对象也是字符串。重复的字母将被删除。如果删除了某些内容,则长度不能与原始字符串相同。本着问题的精神,这里是一个正则表达式的答案
玩
它是^(?=[string]{1,6}$)(?!.*(。。。。.*$
这将检查字符串中是否出现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']
您可以使用代码。根据问题的精神,这里有一个正则表达式的答案
玩
它是^(?=[string]{1,6}$)(?!.*(。。。。.*$
这将检查字符串中是否出现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']
您可以使用代码。对不起,我没有提到-我使用了大量的单词。。。。。所以这个方法需要非常长的时间。有了re,我在7秒内就完成了(但我找不到我正在搜索的函数)。编辑:我可以将这些合并得到结果。非常感谢。@MakaloneLOgman-我记得你说过你不能让正则表达式工作。这是一个很好的例子。我想你可以通过预计算计数器(目标)
来加快速度。对不起,我没有提到-我使用了大量的单词。。。。。所以这个方法需要非常长的时间。有了re,我在7秒内就完成了(但我找不到我正在搜索的函数)。编辑:我可以将这些合并得到结果。非常感谢。@MakaloneLOgman-我记得你说过你不能让正则表达式工作。这是一个很好的例子。我想你可以通过预计算计数器(目标)