Количество раз, которое шаблон регулярного выражения появляется в списке строк - PullRequest
2 голосов
/ 17 января 2020

Скажем, у меня есть список школ:

schools = [
    '00A000',
    '01A000',
    '00B000',
    '01B000',
    '00C000',
    '01C000'
]

Я провожу некоторые исследования данных, и первое, что я хочу сделать, это подсчитать все школы как %A% (есть A посередине).

Я предположил, что мог бы использовать что-то вроде команды ниже:

schools.count('\BA')

Но похоже, что единственный способ использовать регулярное выражение с модулем re :

[re.findall('\BA', x) for x in schools].count(['A'])

Это самый простой способ сделать это?

Полный код:

import re

schools = [
    '00A000',
    '01A000',
    '00B000',
    '01B000',
    '00C000',
    '01C000'
]

# Data exploration. Find count of all district A schools.

# I thought I could use list's built in count and some kind of string regex for it to
# take in:
schools.count('\BA')
# Above example is invalid.

# It looks like I must loop over with regex and then add a count after, right?
[re.findall('\BA', x) for x in schools].count(['A'])

# Repeat for B and C...

Ответы [ 3 ]

1 голос
/ 17 января 2020

Вы можете отказаться от использования регулярных выражений в целом, если вы действительно хотите сопоставить «xyAuv», но не «Axyuv» или «xyuvA», вы можете использовать:

len([1 for school in schools if 'A' in school[1:-1]])

Если есть любое «A» в Строка, конечно, просто использовала бы 'A' in school.

Более забавный способ написать это:

sum('A' in school for school in schools)

, но это может сбивать с толку и это немного медленнее.

Или:

from functools import reduce                                                                                 
from operator import add                                                                                     

reduce(add, ('A' in school for school in schools))                                                           

Что забавно, но немного быстрее.

0 голосов
/ 17 января 2020

Как я уже сказал в своем комментарии, я бы go с:

len(re.findall('\BA\B', ','.join(schools)))

Вот подтверждение концепции:

Python 3.7.6 (default, Dec 19 2019, 22:52:49) 
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> schools = [
...     '00A000',
...     '01A000',
...     '00B000',
...     '01B000',
...     '00C000',
...     '01C000',
...     'A0D000',
...     '01B00A'
... ]
>>> 
>>> len(re.findall('\BA\B', ','.join(schools)))
2
0 голосов
/ 17 января 2020

Как насчет присоединения списка к строке и получения количества вхождений:

import re
print(len(re.findall(r'\BA',','.join(schools))))

Вывод:

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