如何过滤包含N个或更多字符的所有单词?

时间:2011-01-03 14:27:49

标签: python regex linux bash

我想处理一个文本文件,以查找包含超过N个字符的所有单词。欢迎使用Bash(grep,awk)或Python(re)中的任何解决方案!但是,最短的是优先考虑的。

12 个答案:

答案 0 :(得分:12)

egrep -o '[^ ]{N,}' <filename>

查找至少N个字符长的所有非空格构造。如果您担心“单词”,可以尝试[a-zA-Z]

答案 1 :(得分:2)

#!/usr/bin/env python

import sys, re

def morethan(n, file_or_string):
    try:
        content = open(file_or_string, 'r').read()
    except:
        content = file_or_string
    pattern = re.compile("[\w]{%s,}" % n)
    return pattern.findall(content)

if __name__ == '__main__':
    try:
        print morethan(*sys.argv[1:])
    except:
        print >> sys.stderr, 'Usage: %s [COUNT] [FILENAME]' % sys.argv[0]

示例用法(通过this gist):

$ git clone -q git://gist.github.com/763574.git && \
     cd 763574 && python morethan.py 7 morethan.py

['stackoverflow', 'questions', '4585255', 'contain', ...

答案 2 :(得分:2)

的Python

 import fileinput
 N = 5
 for line in fileinput.input():
     for word in line.split():
         if len(word) > N:
              print word

答案 3 :(得分:2)

import re; [s for s in re.findall(r"\w+", open(filename, "r").read()) if len(s) >= N]

答案 4 :(得分:2)

输出大于5的长度的单词和行号

awk -F ' ' '{for(i=1;i<=NF;i++){ if(length($i)>=6) print NR, $i }}' your_file

答案 5 :(得分:1)

你可以使用一个简单的grep,但它会返回整行:

grep '[^ ]\{N\}'

其中N是你的号码。

我不知道如何在grep或awk中获取单个单词,但在Python中很容易:

import re
f = open(filename, 'r')
text = f.read()
big_words = re.findall('[^ ]{N,}', s)

同样,N是你的号码。 big_words将是包含您的单词的列表。

答案 6 :(得分:1)

在此示例中,将5的值替换为您要查找的长度。第二个示例将其显示为函数

1)

>>> import re
>>> filename = r'c:\temp\foo.txt'
>>> re.findall('\w{5}', open(filename).read())
['Lorem', 'ipsum', 'dolor', 'conse', 'ctetu', 'adipi', 'scing', 'digni', 'accum', 'congu', ...]

2)

def FindAllWordsLongerThanN(n=5, file='foo.txt'):
    return re.findall('\w{%s}' % n, open(file).read())

FindAllWordsLongerThanN(7, r'c:\temp\foo.txt')

答案 7 :(得分:1)

re.findall(r'\w'*N+r'\w+',txt)

答案 8 :(得分:0)

试试这个:

N = 5 #Threshold
f = open('test.txt','r')
try:
  for line in f.xreadlines():
    print " ".join([w for w in line.split() if len(w) >= N])
finally:
  f.close()

答案 9 :(得分:0)

为了完整性(尽管在这种情况下regexp解决方案可能更好):

>>> from string import punctuation
>>> with open('foreword.rst', 'rt') as infile:
...    for line in infile:
...       for x in line.split():
...           x = x.strip(punctuation)
...           if len(x) > 5:
...              print x

假设你真的是指“过滤器”,那就是每个单词应该多次打印。如果你只想要一次,我会这样做:

>>> from string import punctuation
>>> result = set()
>>> with open('foreword.rst', 'rt') as infile:
...    for line in infile:
...       for x in line.split():
...           x = x.strip(punctuation)
...           if len(x) > 5:
...              if x not in result:
...                  result.add(x)
...                  print x

答案 10 :(得分:0)

你好我相信这是一个很好的solutino与lambda函数。 第一个参数是N

import sys
import os
def main():
    p_file = open("file.txt")
    t= lambda n,s:filter(lambda t:len(t)>n,s.split())
    for line in p_file:
        print t(3,line)
if __name__ == '__main__':
    main()

答案 11 :(得分:0)

Pure Bash:

N=10; set -o noglob; for word in $(<inputfile); do ((${#word} > N)) && echo "$word"; done; set +o noglob

如果您的inputfile不包含任何通配符(*?[),则可以省略set命令。