正则表达式:查找具有特定字母但不包含其他字母的所有单词

时间:2015-02-09 12:13:43

标签: python regex letters

任何人都可以帮助我:

我需要找到包含字母[t OR d]和[k OR c]但不包含任何[s,z,n,m]的列表中的所有单词

我想出了第一部分,但不知道如何包含停止列表:

\w*[t|d]\w*[k|c]\w*
用Python表示法

提前谢谢

7 个答案:

答案 0 :(得分:2)

您可以使用2个步骤。首先找到t | d AND k | c,然后过滤掉不需要的字母匹配。

既然你说你想出了第一部分,那么这是第二部分:

matches = [i for i in matches if not re.search(r'[sznm]', i)]    
print(matches) 

答案 1 :(得分:1)

如果您需要在t or d之前显示k or c,请使用:[^sznm\s\d]*[td][^sznm\s\d]*[kc][^sznm\s\d]*

[^sznm\s\d]表示除z, n, m, s,空白字符(\s)或数字(\d)以外的任何字符。

答案 2 :(得分:1)

s = "foobar foo".split()

allowed = ({"k", "c"}, {"r", "d"})
forbid = {"s","c","z","m"}

for word in s:
    if all(any(k in st for k in word) for st in allowed) and all(k not in forbid for k in word):
        print(word)

或者使用带有set.intersection的列表comp:

words = [word for word in s if all(st.intersection(word) for st in allowed) and not denied.intersection(word)]

答案 3 :(得分:1)

基于Padraic

的回答

编辑我们都错过了这个条件

  

[t OR d]和[k OR c]

所以 - 相应地修复

s = "detected dot knight track"

allowed = ({"t","d"},{"k","c"})
forbidden = {"s","z","n", "m"}

for word in s.split():
    letter_set = set(word)
    if all(letter_set & a for a in allowed) and letter_set - forbidden == letter_set:
        print(word)

结果是

detected
track

答案 4 :(得分:0)

使用此代码:

import re
re.findall('[abcdefghijklopqrtuvwxy]*[td][abcdefghijklopqrtuvwxy]*[kc][abcdefghijklopqrtuvwxy]*', text)

答案 5 :(得分:0)

我非常喜欢@ padraic-cunningham没有使用re的答案,但这是一个模式,它将起作用:

pattern = r'(?!\w*[sznm])(?=\w*[td])(?=\w*[kc])\w*'

python.org充分记录了

肯定(?=...)和否定(?!...)前瞻断言。

答案 6 :(得分:0)

你需要使用外观。

^(?=.*[td])(?!.*[sznm])\w*[kc]\w*$

即,

>>> l = ['fooktz', 'foocdm', 'foobar', 'kbard']
>>> [i for i in l if re.match(r'^(?=.*[td])(?!.*[sznm])\w*[kc]\w*$', i)]
['kbard']