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

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

Anna Muller

0 / 0 / 0

Регистрация: 20.03.2018

Сообщений: 54

1

Найти в строке все цифры и вывести их

10.04.2018, 15:57. Показов 41133. Ответов 19

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Сама задача
Пусть дано строку, на основе этой строки сформируйте новый, содержащая только цифры.
Выведите строку.

код

Python
1
2
str=input('Строка:')
print(''.join(s for s in str if s.isdigit()))



0



1289 / 906 / 479

Регистрация: 05.12.2013

Сообщений: 3,067

10.04.2018, 16:00

2

Проще чем в одну строку?



0



Рыжий Лис

Просто Лис

Эксперт Python

4944 / 3252 / 1008

Регистрация: 17.05.2012

Сообщений: 9,522

Записей в блоге: 9

10.04.2018, 16:13

3

Лучший ответ Сообщение было отмечено Anna Muller как решение

Решение

Может быть человек не понимает, как работают генераторы.

Держи ради разнообразия регулярку:

Python
1
2
3
4
#!/usr/bin/python3
import re
s = input('Строка:')
print(re.sub(r'D', '', s))



1



Wi0M

394 / 122 / 48

Регистрация: 26.10.2013

Сообщений: 734

10.04.2018, 16:32

4

Python
1
print(''.join((s for s in str if s.isdigit())))

Добавлено через 2 минуты

Python
1
2
3
4
s for s in str if s.isdigit() # это SyntaxError
(s for s in str if s.isdigit()) # это генератор
[s for s in str if s.isdigit()] # это списковое выражение
# а еще есть dict comprehension. но это уже совсем другая история)) пусть останется в качестве домашнего задания



1



woldemas

654 / 458 / 212

Регистрация: 06.09.2013

Сообщений: 1,266

10.04.2018, 16:36

5

Python
1
2
s = input('Строка:')
print("".join(filter(str.isdigit, s)))



0



vic5710

856 / 639 / 248

Регистрация: 10.12.2016

Сообщений: 1,557

10.04.2018, 16:37

6

Цитата
Сообщение от Anna Muller
Посмотреть сообщение

print(”.join(s for s in str if s.isdigit()))

Python
1
2
s = input('Строка:')
print(''.join[i for i in s if i.isdigit()])

str служебное слово питона, не надо перекрывать



0



394 / 122 / 48

Регистрация: 26.10.2013

Сообщений: 734

10.04.2018, 16:42

7

вы че реально не видите что ваши строчки с join вам выплюнут SyntaxError ?))) дважды написали два разных человека) а ошибка одна и таже)))

Добавлено через 26 секунд
во втором случае еще хуже кстати чем в первом))



0



1289 / 906 / 479

Регистрация: 05.12.2013

Сообщений: 3,067

10.04.2018, 16:48

8

В варианте с filter не выплюнет



0



654 / 458 / 212

Регистрация: 06.09.2013

Сообщений: 1,266

10.04.2018, 16:48

9

Цитата
Сообщение от Wi0M
Посмотреть сообщение

вы че реально не видите что ваши строчки с join вам выплюнут SyntaxError ?)))

это какие?



0



1289 / 906 / 479

Регистрация: 05.12.2013

Сообщений: 3,067

10.04.2018, 16:49

10

Цитата
Сообщение от vic5710
Посмотреть сообщение

print(”.join[i for i in s if i.isdigit()])

тут не хватает скобок у join



0



654 / 458 / 212

Регистрация: 06.09.2013

Сообщений: 1,266

10.04.2018, 16:50

11

Цитата
Сообщение от ТабуретY
Посмотреть сообщение

тут не хватает скобок у join

это да, но мой вариант с filter, там не может быть синтаксической ошибки



0



1289 / 906 / 479

Регистрация: 05.12.2013

Сообщений: 3,067

10.04.2018, 16:52

12

Цитата
Сообщение от woldemas
Посмотреть сообщение

но мой вариант с filter, там не может быть синтаксической ошибки

Об этом я написал выше



0



vic5710

856 / 639 / 248

Регистрация: 10.12.2016

Сообщений: 1,557

10.04.2018, 16:54

13

Python
1
2
s = input('Строка:')
print(''.join([i for i in s if i.isdigit()]))

точно исправил



0



394 / 122 / 48

Регистрация: 26.10.2013

Сообщений: 734

10.04.2018, 18:37

14

woldemas, да в том то и дело что я не про фитр я про код ТС и vic5710

Добавлено через 34 секунды

Не по теме:

хотя, думаю, вы уже и так все поняли)



0



0 / 0 / 0

Регистрация: 25.12.2021

Сообщений: 1

25.12.2021, 18:09

15

Строго не судите, я начинающий прогер xD
text = set(input())
print(text)
n_list = []
for i in text:
if ‘0’ <= i <= ‘9’:
n_list.append(i)
print(”.join(sorted(n_list)))



0



285 / 166 / 89

Регистрация: 21.03.2016

Сообщений: 398

25.12.2021, 18:23

16

Цитата
Сообщение от Alex54rus
Посмотреть сообщение

Строго не судите, я начинающий прогер xD

Судить не будем, казним без суда и следствия.

text = set(input()) – почему именно set
и зачем вообще весь этот код, если три года назад эту тему разжевали.

Добавлено через 1 минуту
if ‘0’ <= i <= ‘9’: – Зачем? есть isdigit()



0



1509 / 479 / 56

Регистрация: 10.04.2009

Сообщений: 8,059

25.12.2021, 19:31

17

isalnum-это когда нужно достать только алфавитно-цифровые символы
а как достать только буквы без регулярок, is….?



0



4466 / 3146 / 1112

Регистрация: 21.03.2016

Сообщений: 7,832

25.12.2021, 20:07

18

Ципихович Эндрю, isalpha() не, не слышал???



1



1509 / 479 / 56

Регистрация: 10.04.2009

Сообщений: 8,059

25.12.2021, 20:38

19

Понял спасибо большое



0



Am I evil? Yes, I am!

Эксперт PythonЭксперт Java

15702 / 8949 / 2596

Регистрация: 21.10.2017

Сообщений: 20,621

25.12.2021, 23:02

20

Цитата
Сообщение от Semen-Semenich

isalpha()

Что ж ты ему не рассказал и про isbeta(), isgamma(), islambda()… ?



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

25.12.2021, 23:02

Помогаю со студенческими работами здесь

По заданной строке вывести все цифры, имеющиеся в ней
По заданной строке вывести все цифры, имеющиеся в ней.

Вывести все цифры, встречающиеся в символьной строке больше одного раза
Напишите программу, которая выводит все цифры, встречающиеся в символьной строке больше одного…

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

Вывести все цифры, встречающиеся в символьной строке больше одного раза
Напишите программу, которая выводит все цифры, встречающиеся в символьной строке больше одного…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

20

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