Crossin的编程教室

标题: 【每日一坑 3】 找数字 [打印本页]

作者: crossin先生    时间: 2013-12-17 19:11
标题: 【每日一坑 3】 找数字

昨天的坑,已经有很多人填了。python一行代码就可以搞定这件事,有很多人直接就在微信里回复了解答:
sorted(set(li))

其中li是一个包含重复元素的list。当然你还需要更多一些代码让这个程序更完整。

论坛上也有c语言的版本,相比之下要比python长很多。不过我觉得这只是不同语言的特性不一样,适合不同的场景,并无优劣之分。平常解决一些小问题,我更喜欢用python。

今天的坑:
有一个字符串
text = "aAsmr3idd4bgs7Dlsf9eAF"

请将text字符串中的数字取出,并输出成一个新的字符串。



作者: 近猪者痴    时间: 2013-12-17 19:23
正则表达式

re.findall(r'[\d|.]+',text)
作者: caven    时间: 2013-12-17 19:42
  1. import re

  2. text = "aAsmr3idd4bgs7Dlsf9eAF"
  3. print ''.join(re.findall(r'[\d|.]+',text))
复制代码

作者: nodejx    时间: 2013-12-17 20:21
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Copyright 2013 nodejx
  4. text = "aAsmr3idd4bgs7Dlsf9eAF"
  5. NewString=''.join([i for i in text if i.isdigit()])
  6. print NewString
复制代码

作者: fl0w    时间: 2013-12-17 21:58
NewString.py
  1. #! /usr/bin/env python
  2. # coding:utf-8

  3. import sys

  4. if __name__ == "__main__":
  5.     if len(sys.argv) == 1:
  6.         print 'Please Input like this:./NewString.py aAsmr3idd4bgs7Dlsf9eAF'
  7.     else:
  8.         originString = sys.argv[1]
  9.         digitalList = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
  10.         newString = ''.join([i for i in originString if i in digitalList])
  11.         print newString
复制代码

作者: xuefu    时间: 2013-12-17 23:57
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <sys/types.h>

  4. int main(int argc, const char *argv[])
  5. {
  6.   char *s;
  7.   int len;

  8.   s = "aAsmr3idd4bgs7Dlsf9eAF";
  9.   len = strlen(s);

  10.   int i;
  11.   for (i = 0; i < len; i++)
  12.   {
  13.     if (isdigit(s[i]))
  14.       printf("%c", s[i]);
  15.   }

  16.   printf("\n");

  17.   return 0;
  18. }
复制代码

作者: byron    时间: 2013-12-18 10:00
  1. text = "aAsmr3idd4bgs7Dlsf9eAF"
  2. #只保留数字
  3. list(filter(str.isdigit, text))
  4. #只保留字母
  5. list(filter(str.isalpha, text))
复制代码

作者: 歪脑特    时间: 2013-12-18 10:07
初学者,用笨方法实现的
  1. text = "aAsmr3idd4bgs7Dlsf9eAF"
  2. num = ''

  3. for i in range(len(text)):
  4.     if text[i].isnumeric():
  5.         num += text[i]
复制代码

作者: h01m3s    时间: 2013-12-18 13:17
  1. # -*- coding: utf-8 -*-

  2. '''
  3. 今天的坑:
  4. 有一个字符串
  5. text = "aAsmr3idd4bgs7Dlsf9eAF"

  6. 请将text字符串中的数字取出,并输出成一个新的字符串。
  7. '''

  8. import re

  9. def numonly(text):
  10.         num = re.findall(r'\d+', text)
  11.         print num
  12.         print ''.join(num)


  13. text = "aAsmr3idd4bgs7Dlsf9eAF"

  14. numonly(text)
复制代码

作者: TongShan    时间: 2013-12-18 14:19
  1. import re
  2. p = re.compile(r'\d')
  3. text = "aAsmr3idd4bgs7Dlsf9eAF"
  4. new_text = ''.join(p.findall(text))
复制代码

作者: zeq    时间: 2013-12-18 16:53
  1. text = "aAsmr3idd4bgs7Dlsf9eAF"
  2. new_text = filter(lambda x: x.isdigit(), text)
复制代码

作者: aurora    时间: 2013-12-18 17:50
def filter_digit_from_string(text):
    return ''.join([i for i in text if i.isdigit()])
作者: aurora    时间: 2013-12-18 17:58
def filter_digit_from_string(text):
    return ''.join([i for i in text if i.isdigit()])
作者: fl0w    时间: 2013-12-18 22:24
参考zeq同学,输出字母版
  1. text = 'aAsmr3idd4bgs7Dlsf9eAF'
  2. new_text = filter(lambda x: x.isalpha(), text)
复制代码

作者: liucy    时间: 2013-12-19 01:07
  1. import re
  2. import string

  3. text = "aAsmr3idd4bgs7Dlsf9eAF"

  4. list1 = re.findall( "\d", text)

  5. print ''.join(list1)
复制代码

作者: Ares    时间: 2013-12-19 12:31
text = 'aAsmr3idd4bgs7Dlsf9eAF'
for i in text :
        if '0' <= i <= '9':
                print i,

作者: vose    时间: 2013-12-19 15:16
  1.   1 #!/usr/bin/env python
  2.   2 #coding:utf-8
  3.   3
  4.   4 text = "aAsmr3idd4bgs7Dlsf9eAF"
  5.   5 s = ''
  6.   6 for i in range(0,len(text)-1):
  7.   7     try:
  8.   8         int(text[i])
  9.   9         s += text[i]
  10. 10     except ValueError:
  11. 11         pass
  12. 12 print s
复制代码

作者: scz_000    时间: 2013-12-21 00:41
代码要简短,运行时间也很重要嘛~测试了一下运行时间,1000000次的测试正则要比遍历快5秒,不知道有没有更快的方法~
  1. import re
  2. from functools import partial#给函数传入参数的模块,具体还有什么作用也不清楚
  3. from timeit import Timer#python专用测试时间模块
  4. class C:#定义一个类,里面包含了从字符串取出数字的两个方法
  5.     def bianli(self,string):#遍历
  6.         dit=[]
  7.         for i in string:
  8.             if i.isdigit():
  9.                 dit.append(i)
  10.         new=''.join(dit)
  11.     def zhengze(self,string):#正则表达式
  12.         ne=re.findall(r'[\d|.]',string)

  13. if __name__=='__main__':
  14.     string = raw_input('string:')
  15.     bas=C()
  16.     t_bianli=Timer(partial(bas.bianli,string))#传入参数默Timer对象,第一个参数为需要测试的语句partial使得语句能够传入参数
  17.     t_zhengze=Timer(partial(bas.zhengze,string))
  18.     print t_bianli.timeit()#调用方法timeit默认运行100000次输出计算时间
  19.     print t_zhengze.timeit()
  20.     print t_bianli.repeat()#调用repeat方法默认测试3次,每次一百万次
  21.     print t_zhengze.repeat()
复制代码

作者: crossin先生    时间: 2013-12-21 21:22
scz_000 发表于 2013-12-21 00:41
代码要简短,运行时间也很重要嘛~测试了一下运行时间,1000000次的测试正则要比遍历快5秒,不知道有没有更 ...

有意思。
如果正则compile之后再查找,应该会更快

作者: scz_000    时间: 2013-12-22 19:57
crossin先生 发表于 2013-12-21 21:22
有意思。
如果正则compile之后再查找,应该会更快

应该怎么compile。。。
作者: crossin先生    时间: 2013-12-22 23:46
大概就是
  1. import re
  2. p = re.compile('\d')
  3. m = p.findall( 'aAsmr3idd4bgs7Dlsf9eAF' )
  4. print ''.join(m)
复制代码

作者: nemo    时间: 2014-1-5 20:58
为啥我这单次测总是正则快,repeat后就变成遍历快了?
作者: crossin先生    时间: 2014-1-9 11:17
nemo 发表于 2014-1-5 20:58
为啥我这单次测总是正则快,repeat后就变成遍历快了?

不知道哎
作者: 苍翠的路    时间: 2014-2-26 20:51
#include<iostream>
#include<string>
#include<cctype>

using namespace std;

int main()
{
        string text = "aAsmr3idd4bgs7Dlsf9eAF";
        for(int i=0;i!=text.size();i++)
        {
                if(isdigit(text[i]))
                {
                        cout<<text[i]<<" ";
                }
        }
        cout<<endl;
}



作者: fl0w    时间: 2014-3-4 12:03
近猪者痴 发表于 2013-12-17 19:23
正则表达式

re.findall(r'[\d|.]+',text)

可否解释一下这个正则表达式,|在[]内是什么意思?
作者: crossin先生    时间: 2014-3-4 19:08
fl0w 发表于 2014-3-4 12:03
可否解释一下这个正则表达式,|在[]内是什么意思?

中括号中间的竖线表示分组,就是符合前一组规则也行,符合后一组规则也行。
在这里,不加竖线也是一样的效果。
另外由于我们的题目中没有小数点,所以不加点结果也是一样的。

顺说一句,中括号中的点就是点,否则则是表示 除换行符以外的任意字符
作者: fl0w    时间: 2014-3-5 08:58
crossin先生 发表于 2014-3-4 19:08
中括号中间的竖线表示分组,就是符合前一组规则也行,符合后一组规则也行。
在这里,不加竖线也是一样的 ...

先生可不可以举个例子说说中括号内一定需要加竖线的情况
作者: crossin先生    时间: 2014-3-5 15:45
fl0w 发表于 2014-3-5 08:58
先生可不可以举个例子说说中括号内一定需要加竖线的情况

我试了下
中括号里的竖线就只是表示匹配|这个字符
中括号本身就有了多匹配的功能,和竖线的功能是类似的,放在一起也没有什么用
作者: creek    时间: 2014-6-25 23:25
  1. #!/usr/bin/env python
  2. #coding:UTF-8

  3. import re

  4. text=raw_input('输入一个字符串\n')
  5. patt='.*?(\d).*?'
  6. regex=re.compile(patt)
  7. result=re.findall(regex,text)
  8. str=''
  9. for char in result:
  10.     str+=char
  11. print str
复制代码

作者: toddlerya    时间: 2014-7-21 13:32
import re

text = "aAsmr3idd4bgs7Dlsf9eAF"

result = re.findall(r"[\d]+",text)

print result

作者: 年糕糖    时间: 2015-1-5 11:06
遍历对比 很笨
作者: 年糕糖    时间: 2015-1-5 11:06
  1. text = "aAsmr3idd4bgs7Dlsf9eAF"
  2. y = list(text)
  3. n = ['0','1', '2', '3', '4', '5', '6', '7', '8', '9',]
  4. l = []
  5. for i in range(len(y)-1):
  6.     if y[i] in n:
  7.         l.append(y[i])
  8. print ''.join(l)
复制代码

作者: 十二君    时间: 2015-9-1 03:43
  1. import re

  2. text = "aAsmr3idd4bgs7Dlsf9eAF"

  3. a = re.findall('\d',text)
  4. print ''.join(a)
复制代码
不知道为什么,总觉得对于正则表达式的理解不够到位。
作者: crossin先生    时间: 2015-9-1 17:43
十二君 发表于 2015-9-1 03:43
不知道为什么,总觉得对于正则表达式的理解不够到位。

正则本身就是个巨大的坑,我每次用都还要试一番
作者: manhong2112    时间: 2016-1-16 11:44

  1. import re
  2. str = "aAsmr3idd4bgs7Dlsf9eAF"
  3. print(''.join(re.findall("\d",str)))
复制代码

作者: xqqxjnt1988    时间: 2016-2-3 09:27
本帖最后由 xqqxjnt1988 于 2016-2-3 09:31 编辑

交作业了,大神们请多提宝贵意见,我刚刚写,斗胆交上来请帮我看看

#!\usr\bin\python
#coding=utf-8
#author=xuqq
#这个程序是在一个字符串中找到数字,并把这些数字重新组成一个新的字符串
def num_find(strB):
    total_len=len(strB)
    str_new=[]
    if total_len>0:
        print"Begin to search:"
        for i in range (0,total_len):
            if (strB).isdigit()==True:
                str_new.append(strB)
            else:
                continue
        print "The final new str composed by number is that:\t" , str_new
    else:
        print"Nothing could be found!"
        
def main():
    text = "aAsmr3idd4bgs7Dlsf9eAF"
    num_find(text)
   
if __name__=='__main__':
    main()

没编过程序,所以,哪怕有什么不好的编程习惯,编程思路,都请大神帮我指出来,谢谢
   

作者: fangweiren    时间: 2016-2-6 14:26
用正则
  1. #coding:utf-8
  2. import re
  3. text = "aAsmr3idd4bgs7Dlsf9eAF"
  4. result = re.findall(r'\d',text)
  5. print result
复制代码
本办法
  1. #coding:utf-8
  2. text = "aAsmr3idd4bgs7Dlsf9eAF"
  3. li = '0123456789'
  4. list1 = []
  5. for i in text:
  6.         if i in li:
  7.                 list1.append(i)
  8. print list1       
复制代码

作者: 不许逗    时间: 2016-7-10 19:03
a = raw_input('input text\n')
b = list(a)
list_1 = []
for i in b:
    try:
        i = int(i) + 0
        list_1.append(i)
    except:
        continue
d = "".join([str(v) for v in list_1])
print d


感觉我的方法应该还是比较奇葩的………………
作者: 不许逗    时间: 2016-7-10 19:07
fangweiren 发表于 2016-2-6 14:26
用正则本办法

0123456789………………
服气
作者: bingdashen    时间: 2016-8-8 20:18
新手试试水,楼主看看这个怎么样?
text="aAsmr3idd4bgs7DIsf9eAF"
a=list(text)
b=[]
for i in a :
    if i.isdecimal():
       b.append(i)
print([int(i)for i in b])
作者: crossin先生    时间: 2016-8-9 17:01
bingdashen 发表于 2016-8-8 20:18
新手试试水,楼主看看这个怎么样?
text="aAsmr3idd4bgs7DIsf9eAF"
a=list(text)

可以,你这是python3吧
作者: bingdashen    时间: 2016-8-10 08:44
crossin先生 发表于 2016-8-9 17:01
可以,你这是python3吧

对。
作者: morpheus2222    时间: 2017-1-20 10:36
本帖最后由 morpheus2222 于 2017-1-20 10:39 编辑

text = "aAsmr3idd4bgs7Dlsf9eAF"
result = "".join([s for s in list(text) if s.isdigit()])
print(result)

作者: jssngz    时间: 2017-3-12 21:07
python 新手,正则还不会用 先用笨方法写出两种
  1. text = "aAsmr3idd4bgs7Dlsf9eAF"
  2. number = ''
  3. for i in range(len(text)):
  4.     char =text[i]
  5.     if char.isdigit():
  6.         # python的内建函数,判断是否是数字
  7.         number += char
  8. print(number)
  9. # 第二种解决方法
  10. text = "aAsmr3idd4bgs7Dlsf9eAF"
  11. number = ''
  12. for i in range(len(text)):
  13.     char =text[i]
  14.     try:
  15.         int(char)
  16.         number += char
  17.     except ValueError:
  18.         pass
  19. print(number)
复制代码

作者: zhaozihang    时间: 2017-5-22 09:46
import re
text='aAsmr3idd4bgs7Dlsf9eAF'

print str(re.findall(r'\d+',text))

作者: qingri    时间: 2017-6-7 23:22
# 3
# find all the numbers and combine them to a new string
import re
text = "aAsmr3idd42bgs72Dlsf23eAF"
# regular expression find all the numbers which length greater equal than 1
nums = re.findall("[0-9]+",text)
# check the output
print nums
# join them together
new_str = ''.join(nums)
# check the type of new string
print type(new_str)
# print new string
print new_str
作者: crossin先生    时间: 2017-6-8 09:58
qingri 发表于 2017-6-7 23:22
# 3
# find all the numbers and combine them to a new string
import re


作者: zaizaicaocao    时间: 2017-7-27 21:32
text = "aAsmr3idd4bgs7Dlsf9eAF"
import re
num=re.findall('[0-9]+',text)
print(num)
作者: zaizaicaocao    时间: 2017-7-27 21:33
import re
text = "aAsmr3idd4bgs7Dlsf9eAF"

num=re.findall('[0-9]+',text)
print(num)
作者: wolfog    时间: 2017-8-18 11:20
def findDigit():
    for i in text:
        if i.isdigit():
            listStr.append(i)
text = "aAsmr3idd4bgs7Dlsf9eAF?*"
listStr = []
findDigit()

print "".join(listStr)

作者: wolfog    时间: 2017-8-18 14:22
nodejx 发表于 2013-12-17 20:21

这个忽略了

作者: wzqoo    时间: 2017-9-4 13:26
  1. text = "aAsmr3idd4bgs7Dlsf9eAF"
  2. list_num='0123456789'
  3. list1=''
  4. list2=''
  5. for x in text:
  6.     if x in list_num:
  7.        list1+=x
  8.     else:
  9.        list2+=x
  10. print list1
  11. print list2
复制代码

作者: yy58710623    时间: 2017-9-26 18:22
text = "aAsmr3idd4bgs7Dlsf9eAF"
l=[]
for i in text:
    if '0'<=i<='9':
        l.append(i)  
print(l)
#这个比较的原理是什么

作者: crossin先生    时间: 2017-9-26 20:12
yy58710623 发表于 2017-9-26 18:22
text = "aAsmr3idd4bgs7Dlsf9eAF"
l=[]
for i in text:

字符也可以比较大小,按字母顺序
作者: li_qiuming    时间: 2017-10-5 14:03
  1. import re

  2. text = 'aAsmr3idd4bgs7Dlsf9eAF'

  3. info = re.findall(r"\d",text)

  4. String4Nums = "".join(info)
  5. print String4Nums
复制代码

作者: 小砂    时间: 2018-5-7 17:14
import re
text = "aAsmr3idd4bgs7Dlsf9eAF"
c=re.findall('\d',text)
a=''.join(c)
print a
作者: 金胜利    时间: 2018-6-13 15:50
import re
def change(text):
  number=re.findall(r"[0-9]+",text)
  print (number)
  print ("".join(number))
text="aAsmr3idd4bgs7Dlsf9eAF"
change(text)
作者: 花花啊    时间: 2018-8-24 15:45
本帖最后由 花花啊 于 2018-8-24 15:51 编辑

import re
text='aAsmr3idd4bgs7Dlsf9eAF'
m=re.findall(r'[0-9]',text)
print ''.join(m)
作者: szwfn    时间: 2018-10-11 12:16
Mark下
以供以后复习
作者: FERRYMAN    时间: 2021-2-11 09:46
  1. import re

  2. text = "aAsmr3idd4bgs7Dlsf9eAF"
  3. result = ''.join(re.findall(r'\d+' ,text))
  4. print(result)
复制代码
老师,看了答案之后我发现正则表达式是'[\d|.]+'

但是‘|’不是‘or’ 的意思吗?‘【】’不是表示里面的东西任意一个都能匹配吗?为什么‘|’还能放在【】里?

这个我不太理解,希望老师解释一下,谢谢啦
作者: crossin先生    时间: 2021-2-11 15:17
FERRYMAN 发表于 2021-2-11 09:46
老师,看了答案之后我发现正则表达式是'[\d|.]+'

但是‘|’不是‘or’ 的意思吗?‘【】’不是表示里面的 ...

这里错了,后面楼层里有解释
https://bbs.crossincode.com/foru ... =2301&fromuid=3

不考虑小数点的话,直接 \d+ 就可以
作者: FERRYMAN    时间: 2021-2-11 16:31
crossin先生 发表于 2021-2-11 15:17
这里错了,后面楼层里有解释
https://bbs.crossincode.com/forum.php?mod=redirect&goto=findpost&ptid=8 ...

好的,谢谢老师
作者: ZZZZZ    时间: 2021-4-10 12:57
本帖最后由 ZZZZZ 于 2021-4-11 13:16 编辑
  1. text = “aAsmr3idd4bgs7Dlsf9eAF”
  2. b = “”
  3. c = “”
  4. for a in text:
  5.     if a in ['0','1','2','3','4','5','6','7','8','9']:
  6.         b += a
  7.     else:
  8.         c += str(a)
  9. print(b,c)
  10.         
复制代码

作者: ZZZZZ    时间: 2021-5-2 09:46
text = input()
new_text = []
for i in text:
  if i in list(range(0, 9)):
    new_text.append(i)
for i in new_text:
  print(i)

作者: chinaso1111    时间: 2021-7-6 14:57
text = "aAsmr3idd4bgs7Dlsf9eAF"
num = ''
for i in range(len(text)):
        if text[i].isdigit():
                print("'{}'".format(text[i]),end="")
作者: chinaso1111    时间: 2021-7-6 21:21
  1. for i in str1:
  2.     if i.isdigit() == True:
  3.         print(i,end="")
复制代码
if i.isdigit() == True:
print(i)
作者: Danieldepython    时间: 2022-9-15 14:00
  1. import re
  2. text = "aAsmr3idd4bgs7Dlsf9eAF"
  3. text_new = re.findall("\d",text)
复制代码

作者: xiaolx29    时间: 2023-12-23 21:53
  1. from functools import reduce

  2. text = "aAsmr3idd4bgs7Dlsf9eAF"
  3. text2 = reduce(lambda a, b: ''.join((a, b)), (map(lambda i: i if i.isdigit() else '', text)))
复制代码
我直接上 mapreduce 大法了





欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5