2013-08-01 3 views
0

font: bold 13 Arial ->13처럼 문자열에서 숫자를 가져 오려고합니다. 이 작업을 수행하는 가장 우아하고 파이썬적인 방법은 무엇입니까?문자열에서 숫자를 찾는 우아한 방법은 무엇입니까?

그러나 숫자의 "컨텍스트"도 필요합니다. 그때 나는 다시 그것을 변경하려는 원본 (예 : font: bold 13 Arial ->font: bold 14 Arial)

+6

정규 표현식 –

+2

정규 표현식 "\ d +" –

+1

@ David Robinson을 사용하려고하면 답변으로 게시하여 받아 들일 수 있습니다. – Martin

답변

3

이 문자열로 당신에게 수를 얻을 것이다 당신이 첫 번째 요소 및 캐스트에를 뽑을 수 거기에서

>>> import re 
>>> num_regex = re.compile(r'\d+') 
>>> num_regex.findall("font: bold 13 Arial") 
['13'] 

int.

>>> num_regex = re.compile(r'\d+') 
>>> num_regex.sub('14', "font: bold 13 Arial") 
'font: bold 14 Arial' 

:

마찬가지로, 당신은 지금 당신이 수의 내용을 대체 할 말을하기 때문에 대신 findall

>>> num_regex = re.compile(r'(\d+)') 
>>> matcher = num_regex.search("font: bold 13 Arial") 
>>> matcher.groups() 
('13',) 
>>> matcher.group(1) 
'13' 

search을 사용할 수 있습니다, 당신은 sub 방법을 사용하여 그것을 할 수 마지막으로, 현재 값을 1 씩 증가 시키려면 과 같이 코드를 읽을 수없는 코드가있는과 같이 수행해야합니다.

import re 

source = "font: bold 13 Arial" 
print re.sub(r'\d+', str(int(re.findall(r'\d+', source)[0])+1), source) 

출력 :

font: bold 14 Arial 

이 더 사용할 수있는 방법을하지만, 참고는, 오류 처리 및 입력 위생이 없습니다. 이 양식에서는주의해서 사용하십시오. : P

num_rex = re.compile(r'\d+') 

def increment_str_number(source): 
    return num_rex.sub(str(int(num_rex.findall(source)[0])+1), source) 

그리고 마지막으로, (한도 작동하지만) 소스에 하나 이상의가 가정, 숫자를 모두 교체 :

import re 
num_rex = re.compile(r'\d+') 

def increment_str_number(source): 
    nums = set(num_rex.findall(source)) 
    for num in nums: 
     num = int(num) 
     source = re.sub("%s" % (num), "%s" % (num + 1), source) 
    return source 

INPUT
글꼴을 굵게 13 굴림 15

OUTPUT
폰트 : 굵은 14 굴림 16

+0

아이디어는 _increment_ 숫자로 대체하는 것이 아니므로 숫자 자체와 주변을 검색해야한다.하지만 나는 그것을 위해 분할을 사용할 수 있습니다. – Glycan

+0

@ 글 리칸 : 편집을 참조하십시오. 그 주석을 타이핑 할 때 나는 올바르게했습니다. – sberry

+0

악의적 인 입력을 내 자신의 코드에 넣지는 않을 것입니다. x) – Glycan

관련 문제