在字符串中查找数字的优雅方法是什么?

时间:2013-08-01 02:15:49

标签: python string int

我想从字符串中获取一个数字,例如font: bold 13 Arial - > 13。什么是最优雅和Pythonic的方法呢?

但是,我还需要数字的“上下文”。我想更改它,然后重建原始文件(例如font: bold 13 Arial - > font: bold 14 Arial

1 个答案:

答案 0 :(得分:3)

这会将数字作为字符串

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

从那里你可以拉出第一个元素并转换为int。

同样,您可以使用search代替findall

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

由于您现在说要替换该号码的内容,您可以使用sub方法执行此操作:

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

最后,如果你想做一些事情,比如将当前值增加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
font:bold 13 Arial 15

<强>输出
font:bold 14 Arial 16