Как отфильтровать все слова, которые содержат N или более символов? - PullRequest
0 голосов
/ 03 января 2011

Я хотел бы обработать текстовый файл, чтобы найти все слова, которые содержат более N символов. Любое решение в Bash (grep, awk) или Python (re) приветствуется! Тем не менее, самый короткий вариант предпочтительнее.

Ответы [ 12 ]

12 голосов
/ 03 января 2011
egrep -o '[^ ]{N,}' <filename>

Найти все непробельные конструкции длиной не менее N символов. Если вас беспокоят слова, вы можете попробовать [a-zA-Z].

2 голосов
/ 03 января 2011

выходных слов больше длины 5 и номера строки

awk -F ' ' '{for(i=1;i<=NF;i++){ if(length($i)>=6) print NR, $i }}' your_file
2 голосов
/ 03 января 2011
import re; [s for s in re.findall(r"\w+", open(filename, "r").read()) if len(s) >= N]
2 голосов
/ 03 января 2011

Python

 import fileinput
 N = 5
 for line in fileinput.input():
     for word in line.split():
         if len(word) > N:
              print word
2 голосов
/ 03 января 2011
#!/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]

Пример использования (через этот гист ):

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

['stackoverflow', 'questions', '4585255', 'contain', ...
1 голос
/ 03 января 2011
re.findall(r'\w'*N+r'\w+',txt)
1 голос
/ 03 января 2011

В этом примере замените значение 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')
1 голос
/ 03 января 2011

Вы можете использовать простой 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 будет списком ваших слов.

0 голосов
/ 03 января 2011

Pure Bash:

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

Если ваш входной файл не содержит никаких символов-заглушек (*, ?, [), вы можете опустить команды set.

0 голосов
/ 03 января 2011

привет, я считаю, что это хороший солютино с лямбда-функциями.Первый параметр это 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...