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