正则表达式找到恰好两个'a'的单词

时间:2012-12-27 07:34:34

标签: regex python-2.7

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

4 个答案:

答案 0 :(得分:4)

这个会起作用:

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

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

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

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

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

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

其中sstr是正则表达式转义的子字符串,并且否定前瞻中的重复次数必须比我们想要匹配的次数多1次。

这个稍微复杂一些,我使用负向前瞻来确保字符串不包含子串sstr的n + 1个非重叠实例,然后尝试找到n非重叠实例

答案 1 :(得分: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);

答案 2 :(得分:0)

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

检查您的字词是否与a[^a]*a匹配且与a.*a.*a

不匹配

答案 3 :(得分: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']