LINUX.ORG.RU

Посчитать количество уникального слова в файле с помощью регулярки

 , ,


0

1
def count_word(word):
    result = 0
    stop_world = [word, word + '.', word + '".', word + ',']
    save_file = open('output.txt', "r+")
    for word in save_file.read().split():
        if word in stop_world:          
            result += 1
    return result

Подскажите вместо этого:

stop_world = [word, word + '.', word + '".', word + ','] 
регулярное выражение, пожалуйста.

★★★

Последнее исправление: amazpyel (всего исправлений: 1)

Ответ на: комментарий от powerguy

да, но для счета слово 'hello', 'hello,' и 'hello.' должны быть одинаковы, поэтому нужно использовать регулярное выражение

amazpyel ★★★
() автор топика
Ответ на: комментарий от amazpyel

а если в одной строке несколько таких слов? считать число строк с уникальным словом или число таких слов?

anonymous
()
Ответ на: комментарий от amazpyel

и ещё, первый вариант слова включает в себя все остальные варианты

anonymous
()
Ответ на: комментарий от anonymous

нужно посчитать количество заданного уникального слова с обмолвкой на то, что слова 'hello', 'hello,' и 'hello.' тоже нужно считать.

amazpyel ★★★
() автор топика
Ответ на: комментарий от amazpyel
import re

def count_word(word):
    def cnt(x):
        return len(re.findall(word, x))
    return sum(map(cnt, open('output.txt')))
anonymous
()

питон не знаю, но должно работать

/word[.",]?/g
в JS рботает:

re=/word[.",]?/g
s='foowordfoobarword,fooword"foobar'
w(s.match(re))

J-yes-sir
()

Чтоб не заводить две темы про питонорегулярки можно я спрошу и свой вопрос
Надо вытащить числа из лога в виде
MARKER[1234]
MARKER[654321]
Почему не работает регулярка

(?=MARKER\[)[0-9]{1,10}(?<=\])
?

zolden ★★★★★
()
Ответ на: комментарий от zolden

а почему не так?

#!/usr/bin/env python3

import re

text = '''MARKER[1234]
MARKER[654321]'''

print(re.findall('MARKER\[([0-9]*)\]', text))

anonymous
()

А, да, сразу не заметил, у тебя там ". тогда сложней. но вообще, для твоей задачи, по моему, пойдет просто

/word/g
они все будут матчится по нему.

J-yes-sir
()
Ответ на: комментарий от anonymous

надо вытащить только числовые айдишки, маркер и скобки не нужны

zolden ★★★★★
()
Ответ на: комментарий от zolden

или в твоем варианте:

#!/usr/bin/env python3

import re

text = '''MARKER[1234]
MARKER[654321]'''

print(re.findall('(?<=MARKER\[)([0-9]{1,10})(?=\])', text))

anonymous
()
Ответ на: комментарий от Virtuos86

ого, где почитать как это работает?
везде только про префиксные и постфиксные проверки написано, а как тут не матчится сам маркер?

zolden ★★★★★
()
Ответ на: комментарий от zolden

Ты питон-то хорошо знаешь?
Я такую фигню, наверное, вообще бы без регулярок написал. Для разминки моска, да и не умею я в них, если честно.

Virtuos86 ★★★★★
()
Ответ на: комментарий от anonymous

а это почему не устроило?

Аа, теперь понял хитрость с группировкой, это тоже норм, спасибо

zolden ★★★★★
()
import re
from collections import Counter

text = "Blah, blah, blah text."

raw_words = re.findall(r"[\w']+", text)
words = map(str.lower, raw_words)
freq = Counter(words)
print freq
silw ★★★★★
()
Ответ на: комментарий от silw

Спасибо, теперь буду курить регулярные выражения.

amazpyel ★★★
() автор топика

Решение:

import re
from collections import Counter


def count_word(word):
    result = 0
    save_file = open('output.txt', "r+")
    for word in save_file.read().split():
        raw_words = re.findall(r"[\w']+", word)
        words = map(str, raw_words)
        freq = Counter(words)
        if freq.get(word) is not None:
            result += freq.get(word)
    return result

Спасибо, silw

amazpyel ★★★
() автор топика
Ответ на: комментарий от amazpyel
def count_word(word):
...
    for word in save_file.read().split():
        raw_words = re.findall(r"[\w']+", word)
...
        if freq.get(word) is not None:
            result += freq.get(word)
anonymous
()
Ответ на: комментарий от anonymous

да, это я тут ошибся, у меня на входе searched_word

amazpyel ★★★
() автор топика
Ответ на: комментарий от silw

еще мне подсказали, что использовать регулярки внутри цикла не очень хорошо, поэтому вот окончательное решение:

import re
from collections import Counter


def count_word(searched_word):
    result = 0
    save_file = open('output.txt', "r+")
    regex = re.compile(r"[\w']+")
    for word in save_file.read().split():
        raw_words = regex.findall(word)
        words = map(str, raw_words)
        freq = Counter(words)
        if searched_word in freq:
            result += freq.get(searched_word)
    return result
amazpyel ★★★
() автор топика
Ответ на: комментарий от amazpyel

map(str,...) в данном контексте немного бессмысленно, так как findall и так возвращает список str. А str.lower из предыдуших вариантов - приведение к нижнему регистру, чтобы не различать Hello и hello.

silw ★★★★★
()
Ответ на: комментарий от amazpyel

ну и как-то сложно, цикл и split тут не нужны, проще просто readlines(). Ну либо читать файл построчно.

silw ★★★★★
()
Ответ на: комментарий от silw

Собственно, можно обойтись без мапы и коллекции, а просто добавить установить re.IGNORECASE :

file_count = re.findall(word, file.readline(), re.IGNORECASE)

(в цикле)

amazpyel ★★★
() автор топика
Последнее исправление: amazpyel (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.