这是我的伪代码,但我没有看到正则表达式具有此功能,至少我正在考虑它的方式:
#!/usr/bin/env python
import sys
import os
import re
def main():
wantedchars = re.match([ANY CHAR THAT APPEARS LESS THAN 8 TIMES], <text will be pasted here>)
print wantedchars
if __name__=='__main__':
main()
我想匹配任何ascii字符不仅仅是字母数字和不太有意义的符号
就像我想要匹配括号和反斜杠一样,如果它们出现的次数少于8次,我唯一不关心匹配/返回的是空格字符。
这整件事的原因以及我为什么不试图将文本作为论证传递的原因在于,我将在以后作为我试图组织的学习过程的一部分进行扩展。
我主要想知道我是否以正确的方式解决这个问题
想到的另一个选项是迭代文本中的每个字符,并为每次迭代增加每个唯一字符的计数器,然后可能打印具有最低值的计数器。
答案 0 :(得分:4)
如果8个字符不连续,这里有一种方法可以使用Counter(Python2.7 +)
>>> from collections import Counter
# You can get the letters as a list...
>>> [k for k,v in Counter("<text xx will xx be xx pasted xx here>").items() if v<8]
['a', 'b', 'e', 'd', 'i', 'h', 'l', 'p', 's', 'r', 't', 'w', '<', '>']
# ...or a string
>>> "".join(k for k,v in Counter("<text xx will xx be xx pasted xx here>").items() if v<8)
'abedihlpsrtw<>'
在旧版本的Python中也可以使用计数器。这是2.5 / 2.6
的一个>>> from collections import defaultdict
>>> counter = defaultdict(int)
>>> for c in "<text xx will xx be xx pasted xx here>":
... counter[c]+=1
...
>>> "".join(k for k,v in counter.items() if v<8)
'abedihlpsrtw<>'
这是python2.4的一个
>>> counter={}
>>> for c in "<text xx will xx be xx pasted xx here>":
... counter[c] = counter.get(c,0)+1
...
>>> "".join(k for k,v in counter.items() if v<8)
'abedihlpsrtw<>'