Как я могу посчитать количество чисел в строке - PullRequest
0 голосов
/ 27 февраля 2020

Я хочу посчитать количество чисел в строке s.

В этой строке:

"2019 год был отличным годом для 10 счастливчиков в возрасте от 20 до 60 лет. "

Результат должен быть 4 (2019, 10, 20, 60) Спасибо

Ответы [ 3 ]

2 голосов
/ 27 февраля 2020

re.findall - это довольно простой способ справиться с этим:

import re

s = "2019 was a great year for 10 fortunate people in ages 20 to 60."

# find all groups of digits
re.findall(r'\d+', s)
# ['2019', '10', '20', '60']

Предполагается, что числа не являются числами с десятичной запятой или другими нецелыми числами.

1 голос
/ 27 февраля 2020

Только для подсчета целых чисел вы можете использовать простое регулярное выражение :

import re
s = '2019 was a great year for 10 fortunate people in ages 20 to 60.'
n = len(re.findall(r'\d+', s))  # 4

Здесь '\d+' означает «один или несколько десятичных символов в строке».

Обратите внимание, что re.findall дает list результатов. Если вас заботит только количество элементов (n), это бесполезно для входных строк, содержащих очень много чисел. Вместо этого используйте подход итератора, например

import re
s = '2019 was a great year for 10 fortunate people in ages 20 to 60.'
n = sum(1 for _ in re.finditer(r'\d+', s))  # 4

Включение чисел с плавающей запятой

Допустим, вы разрешаете float s, например 1.2 и 3e-4 et c. также. Соответствующее регулярное выражение теперь намного сложнее, и более простым решением было бы просто l oop над всеми «словами» в строке и проверить, можно ли их интерпретировать как число:

def is_number(num):
    try:
        float(num)
    except:
        return False
    return True

s = '2019 was a great year for 10 fortunate people in ages 20 to 60.'
n = sum(1 for num in s.split() if is_number(num))  # 4
0 голосов
/ 27 февраля 2020

Я бы разбил строку на токены, используя s.split(' '), итерировал по каждому из них и использовал бы регулярное выражение типа \d+, чтобы проверить, что каждый символ является di git, и накапливал бы хорошие тестовые ответы в int.

...