我试图解决一个非常特殊的问题。如果子字符串不必是一个整体,我需要找到字符串中所有子字符串出现的数量。
adnndaend
我会尝试找到子字符串和。
一个 d 名词名词 d A端
一个 DN 第二 A端
一个 d 名词 ndaen的 d
一个 DN 名词 daen的 d
一个 dnndae的第二
adnnd的一电子的第二
6
我尝试使用python re.findall 来实现出现的列表:
re.findall('^.*a.*n.*d.*$', 'adnndaend')
但它只返回一个项目列表 - 整个字符串:
['adnndaend']
那么,请你告诉我,我的正则表达式有什么问题,或者告诉我你更好的解决方案?理想情况下,在Python或Java中,我对其他语言并不十分熟悉。
答案 0 :(得分:2)
正则表达式返回非重叠匹配,在您的情况下只有一个匹配。所以正则表达式是不可能的。相反,我提出了这个小递归函数:
def count(haystack, needle):
result= 0
pos= -1
char= needle[0] # we'll be searching the haystack for all occurences of this character.
while True:
# find the next occurence
pos= haystack.find(char, pos+1)
# if there are no more occurences, we're done
if pos==-1:
return result
# once we found the first character, recursively count the occurences of
# needle (without the first character) in what's left of haystack
if len(needle)==1:
result+= 1
else:
result+= count(haystack[pos+1:], needle[1:])
我没有广泛地测试它,但是:
>>> print count('adnndaend', 'and')
6
答案 1 :(得分:2)
您可以获得使用a,n和d出现次数的所有组合:
from itertools import combinations
def sub_s(st,word):
all_s = (x for x in st if x in word)
return len([x for x in (combinations(all_s, len(word))) if "".join(x) == word] )
答案 2 :(得分:1)
public int findOccurrences(String str, String key) {
int total = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == key.charAt(0)) {
if (key.length() > 1) {
total += findOccurrences(str.substring(i), key.substring(1));
} else {
total += 1;
}
}
}
return total;
}
@Test
public void yup(){
System.out.println(findOccurrences("adnndaend", "and"));
}
输出= 6
答案 3 :(得分:1)
您可以按如下方式使用itertools.combinations:
import itertools
pattern = "and"
print len([''.join(i) for i in itertools.combinations('adnndaend',len(pattern) if ''.join(i) == pattern])
输出:
6
idea是使用itertools.combinations
生成字符序列的所有组合,并将它们与您的模式匹配;结果列表只有匹配的项目。