Я пытаюсь написать программу, которая читает абзац, который подсчитывает специальные символы и слова.
Тогда давайте сосредоточимся на цели, а не на вашем подходе. Ваш подход возможен, вероятно, возможен, но может потребоваться несколько расщеплений, поэтому давайте просто проигнорируем его. Использование re.findall
и длинного регулярного выражения filter
ed должно работать намного лучше.
lst = re.findall(r"\w+|[^\w\s]", some_sentence)
Будет иметь смысл. В разбивке это:
pat = re.compile(r"""
\w+ # one or more word characters
| # OR
[^\w\s] # exactly one character that's neither a word character nor whitespace
""", re.X)
results = pat.findall('"Why, hello there, Martha!"')
# ['"', 'Why', ',', 'hello', 'there', ',', 'Martha', '!', '"']
Однако тогда вам придется пройти еще одну итерацию вашего списка, чтобы подсчитать специальные символы! Давайте тогда разделим их. К счастью, это легко — просто добавьте фигурные скобки.
new_pat = re.compile(r"""
( # begin capture group
\w+ # one or more word characters
) # end capturing group
| # OR
( # begin capture group
[^\w\s] # exactly one character that's neither a word character nor whitespace
) # end capturing group
""", re.X)
results = pat.findall('"Why, hello there, Martha!"')
# [('', '"'), ('Why', ''), ('', ','), ('hello', ''), ('there', ''), ('', ','), ('Martha', ''), ('', '!'), ('', '"')]
grouped_results = {"words":[], "punctuations":[]}
for word,punctuation in results:
if word:
grouped_results['words'].append(word)
if punctuation:
grouped_results['punctuations'].append(punctuation)
# grouped_results = {'punctuations': ['"', ',', ',', '!', '"'],
# 'words': ['Why', 'hello', 'there', 'Martha']}
Затем просто посчитайте свои ключи dict.
>>> for key in grouped_results:
print("There are {} items in {}".format(
len(grouped_results[key]),
key))
There are 5 items in punctuations
There are 4 items in words
21.10.2014
results
превратился в списокfilter(None
списков, один с пунктуацией, другой без, но я не могу думать об этом в данный момент. 21.10.2014words, punctuation = (list(filter(bool, v)) for v in zip(*results))
. 21.10.2014zip(*results)
для замены размеров списка, но хотел фильтровать за один шаг, поэтому решил использовать цикл. TBH, цикл for в любом случае более читабелен :) 21.10.2014[('Why', '"'), ('hello', ','), ('there', ','), ('Martha', '!'), ('????', '"')]
— но последний элемент не имеет слова) 21.10.2014[filter(None,[word]), filter(None,[punctuation]) for word,punctuation in results]
, в результате чего мой итоговый список будет[['these','are','words'], ['this','is','punctuation']]
22.10.2014