Я бы извлек все числа, содержащиеся в строке. Что лучше подходит для цели, регулярных выражений или isdigit()
метода?
Пример:
line = "hello 12 hi 89"
Результат:
[12, 89]
Если вы хотите извлечь только положительные целые числа, попробуйте следующее:
>>> str = "h3110 23 cat 444.4 rabbit 11 2 dog"
>>> [int(s) for s in str.split() if s.isdigit()]
[23, 11, 2]
Я бы сказал, что это лучше, чем пример регулярных выражений по трем причинам. Во-первых, вам не нужен другой модуль; во-вторых, он более читабелен, потому что вам не нужно разбирать мини-язык регулярных выражений; и в-третьих, это быстрее (и, следовательно, скорее более питон):
python -m timeit -s "str = 'h3110 23 cat 444.4 rabbit 11 2 dog' * 1000" "[s for s in str.split() if s.isdigit()]"
100 loops, best of 3: 2.84 msec per loop
python -m timeit -s "import re" "str = 'h3110 23 cat 444.4 rabbit 11 2 dog' * 1000" "re.findall('\\b\\d+\\b', str)"
100 loops, best of 3: 5.66 msec per loop
Это не будет распознавать числа с плавающей запятой, отрицательные целые числа или целые числа в шестнадцатеричном формате. Если вы не можете принять эти ограничения, ответ Слима ниже поможет.
re
. Это общий и мощный инструмент (поэтому вы узнаете что-то очень полезное). Скорость несколько не имеет значения при разборе журнала (это не какой-то интенсивный числовой решатель в конце концов),re
модуль находится в стандартной библиотеке Python, и его загрузка не помешает.mumblejumble45mumblejumble
в которых я знал, что был только один номер. Решение простоеint(filter(str.isdigit, your_string))
.str
которая затем переопределяетstr
объект и метод в базовом питоне. Это не очень хорошая практика, так как она может понадобиться вам позже в сценарии.int(filter(...))
повыситTypeError: int() argument must be a string...
для Python 3.5, так что вы можете использовать обновленную версию:int(''.join(filter(str.isdigit, your_string)))
для извлечения всех цифр в одно целое число.Я бы использовал регулярное выражение:
Это также будет соответствовать 42 от
bla42bla
. Если вам нужны только числа, разделенные границами слов (пробел, точка, запятая), вы можете использовать \ b:Чтобы получить список чисел вместо списка строк:
источник
int
на карту и все готово. +1 особенно для последней части. Я бы предложил сырые строки (r'\b\d+\b' == '\\b\\d+\\b'
), хотя.int_list = [int(s) for s in re.findall('\\d+', 'hello 12 hi 89')]
map
.Это более чем поздно, но вы можете расширить выражение регулярного выражения, чтобы учесть и научную нотацию.
Дает все хорошо!
Кроме того, вы можете посмотреть на регулярное выражение AWS Glue
источник
s = "4"
возвращает совпадений. Можно ли отредактировать, чтобы позаботиться об этом?[+-]?\d*[\.]?\d*(?:(?:[eE])[+-]?\d+)?
Эта группа дает некоторые ложные срабатывания (то+
есть иногда захватывается сама собой), но может обрабатывать больше форм, например.001
, плюс она не объединяет числа автоматически (как вs=2+1
)[-+]?[.]?[\d]+(?:,\d\d\d)*[\.]?\d*(?:[eE][-+]?\d+)?
- так глупо с моей стороны ... как я мог не думать об этом?Я предполагаю, что вы хотите, чтобы числа с плавающей точкой не просто целые числа, поэтому я бы сделал что-то вроде этого:
Обратите внимание, что некоторые другие решения, опубликованные здесь, не работают с отрицательными числами:
источник
float
наint
.re.findall("[-\d]+", "1 -2")
continue
вместоpass
цикла?Если вы знаете, что в строке будет только одно число, то есть «привет 12 привет», вы можете попробовать фильтр.
Например:
Но будь осторожен !!! :
источник
TypeError: int() argument must be a string, a bytes-like object or a number, not 'filter'
- исправил это с помощьюint("".join(filter(str.isdigit, '200 grams')))
источник
Я искал решение для удаления масок строк, особенно с бразильских номеров телефонов, этот пост не ответил, но вдохновил меня. Это мое решение:
источник
Использование Regex ниже - это способ
с поиском
re.findall(r'\d+', "hello 12 hi 89")
re.findall(r'\b\d+\b', "hello 12 hi 89 33F AC 777")
источник
findall()
repl_str = re.compile('\d+.?\d*')
должно быть:repl_str = re.compile('\d+\.?\d*')
Для воспроизводимого примера с использованием python3.7re.search(re.compile(r'\d+.?\d*'), "42G").group()
'42G're.search(re.compile(r'\d+\.?\d*'), "42G").group()
'42'Привет ,
Вы можете искать все целые числа в строке через цифру, используя выражение findall.
На втором шаге создайте список res2 и добавьте найденные в строке цифры в этот список.
надеюсь это поможет
С уважением, Дивакар Шарма
источник
Этот ответ также содержит случай, когда число находится в строке
источник
Я поражен, увидев, что никто еще не упомянул об использовании
itertools.groupby
в качестве альтернативы для достижения этой цели.Вы можете использовать
itertools.groupby()
наряду сstr.isdigit()
тем, чтобы извлечь числа из строки как:Значение удержания
l
будет:PS: Это просто для иллюстрации, чтобы показать, что в качестве альтернативы мы могли бы также использовать
groupby
для достижения этой цели. Но это не рекомендуемое решение. Если вы хотите добиться этого, вы должны использовать принятый ответ fmark, основанный на использовании понимания списка с использованиемstr.isdigit
фильтра.источник
Я просто добавляю этот ответ, потому что никто не добавил один, использующий обработку исключений, и потому что это также работает с плавающей точкой
Вывод :
источник
Чтобы поймать разные шаблоны, полезно запрашивать разные шаблоны.
Настройте все шаблоны, которые улавливают различные числовые шаблоны:
(находит запятые) 12 300 или 12 300,00
'[\ D] + [., \ Д] +'
(находит поплавки) 0,123 или 0,123
'[\ D] * [.] [\ D] +'
(находит целые числа) 123
'[\ D] +'
Объединить с трубой (|) в один шаблон с несколькими или условными .
(Примечание: сначала разместите сложные шаблоны, иначе простые шаблоны будут возвращать фрагменты сложного улова вместо сложного улова, возвращающего полный улов).
Ниже мы подтвердим наличие шаблона с
re.search()
, а затем вернем итеративный список уловов. Наконец, мы распечатаем каждый улов, используя скобочные обозначения, чтобы отобрать возвращаемое значение объекта сопоставления из объекта сопоставления.Возвращает:
источник
Поскольку ни один из них не касался реальных финансовых показателей в Excel и документах Word, которые мне нужно было найти, вот мой вариант. Он обрабатывает целые числа, числа с плавающей запятой, отрицательные числа, номера валют (потому что он не отвечает при разделении), и имеет возможность удалить десятичную часть и просто вернуть целые числа или вернуть все.
Он также обрабатывает систему счисления индейцев лаков, где запятые появляются нерегулярно, а не через каждые 3 числа.
Он не обрабатывает научные обозначения или отрицательные числа, заключенные в круглые скобки в бюджетах - будет казаться положительным.
Это также не извлекает даты. Есть лучшие способы поиска дат в строках.
источник
@jmnas, мне понравился твой ответ, но он не нашел поплавков. Я работаю над сценарием для анализа кода, идущего на станки с ЧПУ, и мне нужно было найти измерения X и Y, которые могут быть целыми или плавающими, поэтому я адаптировал ваш код к следующему. Это находит int, float с положительными и отрицательными значениями. Все еще не находит значения в шестнадцатеричном формате, но вы можете добавить «x» и «A» к «F» в
num_char
кортеж, и я думаю, что он будет анализировать такие вещи, как «0x23AC».источник
Лучший вариант, который я нашел ниже. Он извлечет число и может устранить любой тип символа.
источник
Для телефонных номеров вы можете просто исключить все нецифровые символы с \ D в регулярном выражении:
источник