2014-02-15 6 views
0

Возможно ли без регулярного выражения в python печатать первые n целых чисел из строки, содержащей как целые числа, так и символы?Python печатает первые N целых чисел из строки

Например:

string1 = 'test120202test34234e23424' 
string2 = 'ex120202test34234e23424' 

foo(string1,6) => 120202 
foo(string2,6) => 120202 
+0

все возможно в Python – Ryan

+0

Почему бы вы сделали это без регулярного выражения? –

+0

вы можете просто измерить значение ascii, если его 0x30-0x39 или что-то еще число (проверьте, думаю, 0x30-39 прав, но я могу ошибаться) – Ryan

ответ

3

Вы можете удалить все алфавиты от вас строки с str.translate и ломтиком до количества цифр вы хотите, как этот

import string 

def foo(input_string, num): 
    return input_string.translate(None, string.letters)[:num] 

print foo('test120202test34234e23424', 6) # 120202 
print foo('ex120202test34234e23424', 6) # 120202 

Примечание: Этот простой метод работает только в Python 2.x

Но наиболее эффективный способ должен пойти с itertools.islice

from itertools import islice 

def foo(input_string, num): 
    return "".join(islice((char for char in input_string if char.isdigit()),num)) 

Это самый эффективный способ, потому что он не должен обрабатывать всю строку перед возвратом результата.

+0

Naw, самый эффективный способ - написать расширение C. ;) –

5

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

На простой способ есть.

>>> str = 'test120202test34234e23424' 
>>> str2 = 'ex120202test34234e23424' 
>>> ''.join(c for c in str if c.isdigit())[:6] 
'120202' 
>>> ''.join(c for c in str2 if c.isdigit())[:6] 
'120202' 

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

>>> str3 = "hello 4 world" 
>>> ''.join(c for c in str3 if c.isdigit())[:6] 
'4' 

И не назовите ваши строки str!

+2

Я бы порекомендовал сделать разбивку '. '.join (c для c в str3, если c.isdigit()) [: 6]'. Это много, если вы новичок в Python –

+2

Кто-то может, если захочет - http://stackoverflow.com/posts/21802062/edit - но я просто оставлю несколько советов прямо здесь, для кого-то, кто хочет выполнять свою собственную работу: 1. Строки перебирают по своим символам, ('c' обозначает символ выше), 2. странный« x для x в xs, если foo (x) »обозначение является« генераторным выражением »(a аналогичная концепция - это «понимание списка») и 3. нотация 'foo [: 6]' - «разрезание». –

+0

Достаточно хорошо для меня. +1 –

2

Если вы не хотите, чтобы обработать всю строку - не проблема с длиной строки, которые вы даете в качестве примера - вы можете попробовать:

import itertools 
"".join(itertools.islice((c for c in str2 if c.isdigit()),0,5)) 
+0

BTW, аргумент начала необязателен, если он равен 0 - http://docs.python.org/2/library/itertools.html#itertools.islice –

Смежные вопросы