Регулярные выражения Python и CMD - PullRequest
4 голосов
/ 23 марта 2012

У меня проблемы с работой с питоном.Я должен написать кусок кода, который запускается через CMD.Мне нужно, чтобы он открыл файл, который указал пользователь, и посчитал количество каждого алфавитного символа, который он содержит.

Пока у меня есть это, которое я могу запустить через CDM, и укажите файл для открытия.Я возился с регулярными выражениями, все еще не могу понять, как считать отдельные символы.Есть идеи?извините, если я плохо объяснил это.

import sys
import re


filename = raw_input()
count = 0
datafile=open(filename, 'r')

Ответы [ 5 ]

3 голосов
/ 23 марта 2012

Тип счетчика полезен для подсчета предметов. Это было добавлено в python 2.7:

import collections
counts = collections.Counter()
for line in datafile:
    # remove the EOL and iterate over each character
    #if you desire the counts to be case insensitive, replace line.rstrip() with line.rstrip().lower()
    for c in line.rstrip():
        # Missing items default to 0, so there is no special code for new characters
        counts[c] += 1

Чтобы увидеть результаты:

results = [(key, value) for key, value in counts.items() if key.isalpha()]
print results
2 голосов
/ 24 марта 2012

Если файл достаточно мал, чтобы его можно было прочитать сразу, это действительно очень просто:

from collections import Counter

filename = raw_input()
with open(filename) as f:
    data = f.read()
counter = Counter(data.lower())

print('\n'.join(str((ch, counter[ch])) for ch in counter if ch.isalpha()))
1 голос
/ 23 марта 2012

Регулярные выражения полезны, если вы хотите найти сложные шаблоны в строке.Поскольку вы хотите считать (а не находить) простые (просто отдельные буквенные символы) «шаблоны», регулярные выражения здесь не являются инструментом выбора.

Если я правильно понимаю, что вы пытаетесь, наиболее прозрачнымЧтобы решить эту проблему, нужно выполнить итерацию по всем строкам и выполнить итерацию по всем символам в этой строке, и, если этот символ является алфавитным, добавьте 1 к соответствующей записи словаря.В коде:

filename=raw_input()
found = {}

with open(filename) as file:
    for line in file:
        for character in line:
            if character in "abcdefghijklmnopqrstuvxyz":
            # Checking `in (explicit string)` is not quick, but transparent.
            # You can use something like `character.isalpha()` if you want it to
            # automatically depend on your locale.
                found[character] = found.get(character, 0)+1
                # If there is no dictionary entry for character yet, assume default 0
                # If you need e.g. small and capital letters counted together,
                # "Normalize" them to one particular type, for example using
                # found[character.upper()] = found.get(character, 0)+1

После того, как этот цикл пройдет через файл, словарь found будет содержать количество вхождений для каждого символа.

1 голос
/ 23 марта 2012

Я бы держался подальше от регулярных выражений.Они будут медленными и безобразными.Вместо этого прочитайте весь файл в строку и используйте встроенный строковый метод count для подсчета символов.

Чтобы собрать его для вас:у вас есть словарь counts, содержащий все счета.Например, counts['a'] дает вам число a s в файле.Или, для всего списка подсчетов, сделайте counts.items().

1 голос
/ 23 марта 2012

Если вы хотите использовать регулярные выражения, вы можете сделать следующее:

pattern = re.compile('[^a-zA-Z]+') # pattern for everything but letters
only_letters = pattern.sub(text, '') # delete everything else
count = len(only_letters) # total number of letters

Для подсчета количества различных символов используйте Счетчик, как уже советовали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...