#regex #string
#регулярное выражение #строка
Вопрос:
Я пытаюсь узнать октябрь (упоминается 2 раза), у меня возникла идея использовать dictionary для решения этой проблемы. Однако я много боролся, чтобы выяснить, как найти / разделить месяцы, я не смог использовать свое решение для значений 1st str, где есть некоторые пробелы. Может кто-нибудь, пожалуйста, подсказать, как я могу изменить этот раздел разделения, чтобы покрыть — и пробел?
import re
#str="May-29-1990, Oct-18-1980 ,Sept-1-1980, Oct-2-1990"
str="May-29-1990,Oct-18-1980,Sept-1-1980,Oct-2-1990"
val=re.split(',',str)
monthList=[]
myDictionary={}
#put the months in a list
def sep_month():
for item in val:
if not item.isdigit():
month,day,year=item.split("-")
monthList.append(month)
#process the month list from above
def count_month():
for item in monthList:
if item not in myDictionary.keys():
myDictionary[item]=1
else:
myDictionary[item]=myDictionary.get(item) 1
for k,v in myDictionary.items():
if v==2:
print(k)
sep_month()
count_month()
Ответ №1:
from datetime import datetime
import calendar
from collections import Counter
datesString = "May-29-1990,Oct-18-1980,Sep-1-1980,Oct-2-1990"
datesListString = datesString.split(",")
datesList = []
for dateStr in datesListString:
datesList.append(datetime.strptime(dateStr, '%b-%d-%Y'))
monthsOccurrencies = Counter((calendar.month_name[date.month] for date in datesList))
print(monthsOccurrencies)
# Counter({'October': 2, 'May': 1, 'September': 1})
Что следует знать в моем решении с %b
для месяца, так это то, что оно Sept
изменилось на Sep
для работы (месяц как сокращенное название локали). В этом случае вы можете использовать либо полное название месяца (%B), либо сокращенное название (%b). Если вы не можете использовать большую строку с правильным форматированием названия месяца, просто замените неправильные («Sept», например, на «Sep» и всегда работайте с date obj).
Комментарии:
1. Спасибо, я не думал использовать параметр datetime. Я буду экспериментировать с этим.
2. Я предлагаю использовать
datetime.strptime
вместо пользовательского решения, зациклив значение strings и обрезав или разделив строку, поскольку в будущем ваши данные могут измениться, и в этом случае вам придется удалить свою пользовательскую реализацию и создать новую реализацию. Между тем, с помощьюdatetime.strptime
функции вы просто меняете формат шаблона даты и можете повторно использовать тот же код
Ответ №2:
Не уверен, что regex — лучший инструмент для этой работы, я бы просто использовал strip()
вместе с split()
для решения ваших проблем с пробелами и получения списка сокращений только за месяц. Затем вы могли бы создать dict с подсчетами по месяцам, используя метод list count()
. Например:
dates = 'May-29-1990, Oct-18-1980 ,Sept-1-1980, Oct-2-1990'
months = [d.split('-')[0].strip() for d in dates.split(',')]
month_counts = {m: months.count(m) for m in set(months)}
print(month_counts)
# {'May': 1, 'Oct': 2, 'Sept': 1}
Или даже лучше с collections.Counter
:
from collections import Counter
dates = 'May-29-1990, Oct-18-1980 ,Sept-1-1980, Oct-2-1990'
months = [d.split('-')[0].strip() for d in dates.split(',')]
month_counts = Counter(months)
print(month_counts)
# Counter({'Oct': 2, 'May': 1, 'Sept': 1})