0

我想要一个正则表达式,它可以找到恰好两个a(不是 3、4、5、。)需要模式的单词?不必排成一行。 ["taat","weagda","aa"]可以,但不是这个["a","eta","aaa","aata","ssdfaasdfa"]

4

4 回答 4

4

这将起作用:

^[^a]*a[^a]*a[^a]*$

更通用的版本,您可以将 2 替换为任意数字:

^(?:[^a]*a){2}[^a]*$

上面的 2 个正则表达式利用a了单个字符这一事实,因此我们可以确保所有其他字符都不是a. 第二个使用重复符号。

更通用的版本“不超过 n 个非重叠子字符串”(启用 DOTALL 模式):

^(?!(?:.*sstr){3})(?:.*sstr){2}.*$

wheresstr是一个正则表达式转义的子字符串,并且负前瞻中的重复次数必须比我们要匹配的次数多 1。

这个有点棘手,我使用负前瞻来确保字符串不包含 substring 的 n + 1 个非重叠实例sstr,然后尝试准确找到 n 个非重叠实例。

于 2012-12-27T07:38:24.723 回答
0

您也可以将Counter对象用于此任务。

In [1]: from collections import Counter

In [2]: words = ["taat","weagda","aa", "a","eta","aaa","aata","ssdfaasdfa"]

In [3]: [word for word in words if Counter(word)['a'] == 2]
Out[3]: ['taat', 'weagda', 'aa']
于 2012-12-27T11:38:03.100 回答
0

在这种情况下,我认为,您可以使用字符串来查找,只需使用 for 循环。

mylist = ["taat","weagda","aa","eta","aaa","aata","ssdfaasdfa"];
resultList = [];
for x in mylist:
    count = 0;
    for c in x:
        if c == 'a':
            count = count +1;
    if count == 2:
        resultList.append(x);

print(resultList);
于 2012-12-27T07:43:19.190 回答
0

用两个正则表达式来做,而不是试图把它全部塞进一个。

检查您的单词a[^a]*a是否匹配a.*a.*a

于 2012-12-27T07:45:40.803 回答