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

This is more than a bit late, but you can extend the regex expression to account for scientific notation too.

import re

# Format is [(<string>, <expected output>), ...]
ss = [("apple-12.34 ba33na fanc-14.23e-2yapple+45e5+67.56E+3",
       ['-12.34', '33', '-14.23e-2', '+45e5', '+67.56E+3']),
      ('hello X42 I'm a Y-32.35 string Z30',
       ['42', '-32.35', '30']),
      ('he33llo 42 I'm a 32 string -30', 
       ['33', '42', '32', '-30']),
      ('h3110 23 cat 444.4 rabbit 11 2 dog', 
       ['3110', '23', '444.4', '11', '2']),
      ('hello 12 hi 89', 
       ['12', '89']),
      ('4', 
       ['4']),
      ('I like 74,600 commas not,500', 
       ['74,600', '500']),
      ('I like bad math 1+2=.001', 
       ['1', '+2', '.001'])]

for s, r in ss:
    rr = re.findall("[-+]?[.]?[d]+(?:,ddd)*[.]?d*(?:[eE][-+]?d+)?", s)
    if rr == r:
        print('GOOD')
    else:
        print('WRONG', rr, 'should be', r)

Gives all good!

Additionally, you can look at the AWS Glue built-in regex

def get_digits(str1):
    c = ""

    for i in str1:
        if i.isdigit():
            c += i
            return c

Above is the code that I used and the problem is that it only returns only the first digit of strings. For this, I have to keep both for loop and return statement. Anyone knows how to fix?

Thanks.

Some programmer dude's user avatar

asked Aug 17, 2012 at 12:12

Kevvv's user avatar

2

As the others said, you have a semantic problem on your indentation, but you don’t have to write such function to do that, a more pythonic way to do that is:

def get_digits(text):
    return filter(str.isdigit, text)

On the interpreter:

>>> filter(str.isdigit, "lol123")
'123'

Some advice

Always test things yourself when people shows ‘faster’ methods:

from timeit import Timer

def get_digits1(text):
    c = ""
    for i in text:
        if i.isdigit():
            c += i
    return c

def get_digits2(text):
    return filter(str.isdigit, text)

def get_digits3(text):
    return ''.join(c for c in text if c.isdigit())

if __name__ == '__main__':
    count = 5000000
    t = Timer("get_digits1('abcdef123456789ghijklmnopq123456789')", "from __main__ import get_digits1")
    print t.timeit(number=count)

    t = Timer("get_digits2('abcdef123456789ghijklmnopq123456789')", "from __main__ import get_digits2")
    print t.timeit(number=count)

    t = Timer("get_digits3('abcdef123456789ghijklmnopq123456789')", "from __main__ import get_digits3")
    print t.timeit(number=count)



~# python tit.py
19.990989106  # Your original solution
16.7035926379 # My solution
24.8638381019 # Accepted solution

answered Aug 17, 2012 at 12:19

Tarantula's user avatar

TarantulaTarantula

18.8k12 gold badges54 silver badges71 bronze badges

2

Your indentation is a bit borked (indentation in Python is quite important). Better:

def get_digits(str1):
    c = ""
    for i in str1:
        if i.isdigit():
            c += i
    return c

A shorter and faster solution using generator expressions:

''.join(c for c in my_string if c.isdigit())

lvc's user avatar

lvc

33.9k9 gold badges72 silver badges98 bronze badges

answered Aug 17, 2012 at 12:16

Benjamin Wohlwend's user avatar

Benjamin WohlwendBenjamin Wohlwend

30.6k11 gold badges90 silver badges100 bronze badges

5

it’s because your return statement is inside the for loop, so it returns after the first true if condition and stops.

  def get_digits(str1):
      c = ""
      for i in str1:
        if i.isdigit():
            c += i
      return c

answered Aug 17, 2012 at 12:15

Ashwini Chaudhary's user avatar

Ashwini ChaudharyAshwini Chaudhary

242k58 gold badges459 silver badges503 bronze badges

Of course it returns only the first digit, you explicitly tell Python to return as soon as you have a digit.

Change the indentation of the return statement and it should work:

def get_digits(str1):
    c = ""

    for i in str1:
        if i.isdigit():
            c += i

    # Note the indentation here
    return c

answered Aug 17, 2012 at 12:16

Some programmer dude's user avatar

there is an indentation problem which returns when it finds the first digit, as with current indentation, it is intepreted as a statement inside if statement,
it needs to be parallel to the for statement
to be considered outside for statement.

def get_digits(str1):
    c = ""

    for i in str1:
        if i.isdigit():
            c += i

    return c

digits = get_digits("abd1m4m3m22mmmbb4")
print(digits)

A curly braces equivalent of your incorrect code is :

def get_digits(str1){
    c = ""

    for i in str1 {
        if i.isdigit(){
            c += i
            return c    # Notice the error here
        }
    }
}

And when the code is corrected to move the return statement in alignment with for, the equivalent is :

def get_digits(str1){
        c = ""

        for i in str1 {
            if i.isdigit(){
                c += i               
            }
        }
        return c    # Correct as required
    }

answered Aug 17, 2012 at 12:15

DhruvPathak's user avatar

DhruvPathakDhruvPathak

41.7k16 gold badges116 silver badges174 bronze badges

Your code was almost ok, except the return statement needed to be moved to the level of your for-loop.

def get_digits(str1):
    c = ""
    for i in str1:
        if i.isdigit():
            c += i
    return c   ## <--- moved to correct level

so, now:

get_digits('this35ad77asd5')

yields:

'35775'

Explanation:

Previously, your function was returning only the first digit because when it found one the if statement was executed, as was the return (causing you to return from the function which meant you didn’t continue looking through the string).

Whitespace/indentation really matters in Python as you can see (unlike many other languages).

answered Aug 17, 2012 at 12:15

Levon's user avatar

LevonLevon

137k33 gold badges199 silver badges188 bronze badges

Извлечь из строки числа

Дана строка, содержащая натуральные числа и слова. Необходимо сформировать список из чисел, содержащихся в этой строке. Например, задана строка “abc83 cde7 1 b 24”. На выходе мы должны получить список [83, 7, 1, 24].

Решение задачи на языке программирования Python

Следует посимвольно перебирать строку. Если очередной символ цифра, надо добавить ее в новую строку. Далее проверять символы за ней, и если они тоже цифры, то добавлять их в конец этой новой подстроки из цифр. Когда очередной символ окажется не цифрой, или будет достигнут конец строки, то надо преобразовать строку из цифр в число и добавить в список.

s = input()
 
length = len(s)
integers = []
i = 0  # индекс текущего символа
 
while i < length:
    s_int = ''  # строка для нового числа
    while i < length and '0' <= s[i] <= '9':
        s_int += s[i]
        i += 1
    i += 1
    if s_int != '':
        integers.append(int(s_int))
 
print(integers)

5 dkfj78df 9 8 dkfj8
[5, 78, 9, 8, 8]

Обратите внимание, что данное решение извлекает именно числа, а не цифры. Иначе мы бы не получили число 78, а получили отдельно цифру 7 и цифру 8. Задача на извлечение цифр существенно проще.

Решение через цикл for:

a = input()
num_list = []
 
num = ''
for char in a:
    if char.isdigit():
        num = num + char
    else:
        if num != '':
            num_list.append(int(num))
            num = ''
if num != '':
    num_list.append(int(num))
 
print(num_list)

Если в строке числа всегда отделены от слов пробелами, задача решается проще:

s = input()
word_list = s.split()
num_list = []
 
for word in word_list:
    if word.isnumeric():
        num_list.append(int(word))
 
print(num_list)

Здесь происходит разделение строки на слова по пробелам. В цикле с помощью метода isnumeric каждое слово проверяется, является ли оно числом. Подобную задачу можно решить в одну строку, если использовать функцию filter.

s = input()
word_list = s.split()
 
num_list = [int(num) for num in filter(
    lambda num: num.isnumeric(), word_list)]
 
print(num_list)

В функцию filter передается лямбда-выражение, проверяющее слова, и список слов. Функция возвращает список строк-чисел. Далее с помощью генератора списка строки преобразовываются в целочисленный тип.

На практике при решении подобных задач, когда надо найти и извлечь из строки что-либо, обычно пользуются регулярными выражениями. В примере ниже не обязательно, чтобы число было отделено пробелами.

import re
 
s = input()
 
nums = re.findall(r'd+', s)
 
nums = [int(i) for i in nums]
 
print(nums)

Для поиска вещественных чисел:

import re
 
s = input()
 
nums = re.findall(r'd*.d+|d+', s)
 
nums = [float(i) for i in nums]
 
print(nums)

Больше задач в PDF

Чтобы найти числа определенной длины, N – это строка, используйте регулярное выражение [0-9] + для поиска числовых строк любой длины. [0-9] соответствует одной цифре. После того, как вы найдете все элементы, отфильтруйте их по указанной длине.

Пример 1

В следующем примере мы берем строку и находим в ней все трехзначные числа.

import re

str = 'We four guys, live at 2nd street of Malibeu 521. I had a cash of $248 in my pocket. I got a ticket with serial number 88796451-52.'

#search using regex
x = re.findall('[0-9]+', str)
print('All Numbersn',x)

#digits of length N
N=3

def filterNumber(n):
	if(len(n)==N):
		return True
	else:
		return False
		
#filter the list
finalx = list(filter(filterNumber, x))
print('Final Listn',finalx)

Вывод:

All Numbers
 ['2', '521', '248', '88796451', '52']
Final List
 ['521', '248']

Ниже приводится объяснение наиболее заметных программных операторов в приведенном выше примере:

  1. re.findall (‘[0-9] +’, str) возвращает все слова, которые являются числами.
  2. Функция filterNumber(n) возвращает истину, если длина числа n равна указанной нами длине N.
  3. Отфильтруйте список, возвращенный на шаге 1, с помощью функции, определенной на шаге 2.
  4. Фильтр на шаге 3 возвращает список, содержащий числа указанной длины.

Мы узнали, как получить список чисел определенной длины, используя регулярное выражение в Python.

Как получить список всех чисел из строки?

Чтобы получить список всех чисел в строке, используйте регулярное выражение «[0-9] +» с методом re.findall(). [0-9] представляет собой регулярное выражение, соответствующее одной цифре в строке. [0-9] + представляет собой непрерывные последовательности цифр любой длины.

numbers = re.findall('[0-9]+', str)

Где, str – строка, в которой нам нужно найти числа. re.findall() возвращает список строк, соответствующих регулярному выражению.

Пример 1

В следующем примере мы возьмем строку. Мы живем по адресу 9–162, Малибеу. Мой номер телефона – 666688888. Я найду все числа [‘9’, ‘162’, ‘666688888’], присутствующие в строке.

import re

str = 'We live at 9-162 Malibeu. My phone number is 666688888.'
#search using regex
x = re.findall('[0-9]+', str)
print(x)

Вывод:

['9', '162', '666688888']

Пример 2: получение списка всех непрерывных цифр в строке

В следующем примере мы возьмем строку: Мы, четверо, живем на 2-й улице Малибеу. У меня в кармане было 248 долларов наличными. Я получил билет с серийным номером 88796451-52. И нахожу все числа [‘2’, ‘248’, ‘88796451’, ’52’], присутствующие в строке.

import re

str = 'We four guys, live at 2nd street of Malibeu. I had a cash of $248 in my pocket. I got a ticket with serial number 88796451-52.'
#search using regex
x = re.findall('[0-9]+', str)
print(x)

Вывод:

['2', '248', '88796451', '52']

Мы узнали, как получить все числа в виде строки в виде списка, используя регулярные выражения в Python, с помощью примеров программ.

Как получить список всех чисел из строки?

Чтобы получить список всех чисел в строке, используйте регулярное выражение «[0-9] +» с методом re.findall(). [0-9] представляет собой регулярное выражение, соответствующее одной цифре в строке. [0-9] + представляет собой непрерывные последовательности цифр любой длины.

numbers = re.findall('[0-9]+', str)

Где, str – строка, в которой нам нужно найти числа. re.findall() возвращает список строк, соответствующих регулярному выражению.

Пример 1

В следующем примере мы возьмем строку. Мы живем по адресу 9–162, Малибеу. Мой номер телефона – 666688888. Я найду все числа [‘9’, ‘162’, ‘666688888’], присутствующие в строке.

import re

str = 'We live at 9-162 Malibeu. My phone number is 666688888.'
#search using regex
x = re.findall('[0-9]+', str)
print(x)

Вывод:

['9', '162', '666688888']

Пример 2: получение списка всех непрерывных цифр в строке

В следующем примере мы возьмем строку: Мы, четверо, живем на 2-й улице Малибеу. У меня в кармане было 248 долларов наличными. Я получил билет с серийным номером 88796451-52. И нахожу все числа [‘2’, ‘248’, ‘88796451’, ’52’], присутствующие в строке.

import re

str = 'We four guys, live at 2nd street of Malibeu. I had a cash of $248 in my pocket. I got a ticket with serial number 88796451-52.'
#search using regex
x = re.findall('[0-9]+', str)
print(x)

Вывод:

['2', '248', '88796451', '52']

Мы узнали, как получить все числа в виде строки в виде списка, используя регулярные выражения в Python, с помощью примеров программ.

Автор оригинала: Pankaj Kumar.

Здравствуйте, читатели! В этой статье мы будем сосредоточиться на способы извлечения цифр из строки Python Отказ Итак, давайте начнем.

1. Использование функции ISDIGIT () для извлечения цифр из строки Python

Python предоставляет нам string.isdigit () Чтобы проверить наличие цифр в строке.

Python Isdigit () Функция возвращает Правда Если входная строка содержит цифровые символы в нем.

Синтаксис :

Нам не нужно проходить ни один параметр к нему. В качестве вывода он возвращает true или false в зависимости от наличия цифр символов в строке.

Пример 1:

inp_str = "Python4Journaldev"

print("Original String : " + inp_str) 
num = ""
for c in inp_str:
    if c.isdigit():
        num = num + c
print("Extracted numbers from the list : " + num) 

В этом примере мы имеем итерацию входной строки символа по символу с использованием A для LOOP. Как только функция ISDIGIT () сталкивается с цифрой, она будет хранить его в строковую переменную с именем «NUM».

Таким образом, мы видим вывод, как показано ниже

Выход:

Original String : Python4Journaldev
Extracted numbers from the list : 4

Теперь мы можем даже использовать понимание списка Python для клуба итерации и iDigit () в одну строку.

При этом цифры символов хранятся в списке «Num», как показано ниже:

Пример 2:

inp_str = "Hey readers, we all are here be 4 the time!"


print("Original string : " + inp_str) 


num = [int(x) for x in inp_str.split() if x.isdigit()] 

 
print("The numbers list is : " + str(num)) 

Выход:

Original string : Hey readers, we all are here be 4 the time!
The numbers list is : [4]

2. Использование библиотеки Regex для извлечения цифр

Библиотека регулярных выражений Python называется « » Библиотека Regex «Позволяет нам обнаружить наличие конкретных символов, таких как цифры, некоторые специальные символы и т. Д. Из строки.

Нам нужно импортировать библиотеку Regex в среду Python, прежде чем выполнять любые дальнейшие шаги.

Далее мы мы Re.findall (R ' D +', String) Чтобы извлечь цифры символов из строки. Часть ‘ D +’ поможет функцию findall () для обнаружения наличия любой цифры.

Пример:

import re
inp_str = "Hey readers, we all are here be 4 the time 1!"


print("Original string : " + inp_str) 

num = re.findall(r'd+', inp_str) 

print(num)

Итак, как видно ниже, мы получим список всех цифр из строки.

Выход:

Original string : Hey readers, we all are here be 4 the time 1!
['4', '1']

Заключение

По этому, мы подошли к концу этой темы. Не стесняйтесь комментировать ниже, если вы столкнетесь с любым вопросом.

Я рекомендую всем вам попробовать реализацию приведенных выше примеров с использованием структур данных, таких как списки, Dict и т. Д.

Для большего количества таких постов, связанных с Python, оставаться настроенными, а до тех пор, как потом, счастливое обучение !! 🙂.

Добавить комментарий