任何人都可以帮助我:
我需要找到包含字母[t OR d]和[k OR c]但不包含任何[s,z,n,m]的列表中的所有单词
我想出了第一部分,但不知道如何包含停止列表:
\w*[t|d]\w*[k|c]\w*
用Python表示法
提前谢谢
答案 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']