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.
asked Aug 17, 2012 at 12:12
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
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
33.9k9 gold badges72 silver badges98 bronze badges
answered Aug 17, 2012 at 12:16
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 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
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
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
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 Метки нет (Все метки)
Сама задача код
0 |
1289 / 906 / 479 Регистрация: 05.12.2013 Сообщений: 3,067 |
|
10.04.2018, 16:00 |
2 |
Проще чем в одну строку?
0 |
Рыжий Лис Просто Лис 4944 / 3252 / 1008 Регистрация: 17.05.2012 Сообщений: 9,522 Записей в блоге: 9 |
||||
10.04.2018, 16:13 |
3 |
|||
Сообщение было отмечено Anna Muller как решение РешениеМожет быть человек не понимает, как работают генераторы. Держи ради разнообразия регулярку:
1 |
Wi0M 394 / 122 / 48 Регистрация: 26.10.2013 Сообщений: 734 |
||||||||
10.04.2018, 16:32 |
4 |
|||||||
Добавлено через 2 минуты
1 |
woldemas 654 / 458 / 212 Регистрация: 06.09.2013 Сообщений: 1,266 |
||||
10.04.2018, 16:36 |
5 |
|||
0 |
vic5710 856 / 639 / 248 Регистрация: 10.12.2016 Сообщений: 1,557 |
||||
10.04.2018, 16:37 |
6 |
|||
print(”.join(s for s in str if s.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 |
вы че реально не видите что ваши строчки с join вам выплюнут SyntaxError ?))) это какие?
0 |
1289 / 906 / 479 Регистрация: 05.12.2013 Сообщений: 3,067 |
|
10.04.2018, 16:49 |
10 |
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 |
тут не хватает скобок у join это да, но мой вариант с filter, там не может быть синтаксической ошибки
0 |
1289 / 906 / 479 Регистрация: 05.12.2013 Сообщений: 3,067 |
|
10.04.2018, 16:52 |
12 |
но мой вариант с filter, там не может быть синтаксической ошибки Об этом я написал выше
0 |
vic5710 856 / 639 / 248 Регистрация: 10.12.2016 Сообщений: 1,557 |
||||
10.04.2018, 16:54 |
13 |
|||
точно исправил
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
0 |
285 / 166 / 89 Регистрация: 21.03.2016 Сообщений: 398 |
|
25.12.2021, 18:23 |
16 |
Строго не судите, я начинающий прогер xD Судить не будем, казним без суда и следствия. text = set(input()) – почему именно set Добавлено через 1 минуту
0 |
1509 / 479 / 56 Регистрация: 10.04.2009 Сообщений: 8,059 |
|
25.12.2021, 19:31 |
17 |
isalnum-это когда нужно достать только алфавитно-цифровые символы
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! 15702 / 8949 / 2596 Регистрация: 21.10.2017 Сообщений: 20,621 |
|
25.12.2021, 23:02 |
20 |
isalpha() Что ж ты ему не рассказал и про isbeta(), isgamma(), islambda()… ?
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
25.12.2021, 23:02 |
Помогаю со студенческими работами здесь По заданной строке вывести все цифры, имеющиеся в ней Вывести все цифры, встречающиеся в символьной строке больше одного раза Вывести все цифры, встречающиеся в символьной строке больше одного раза Вывести все цифры, встречающиеся в символьной строке больше одного раза Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 20 |