从字符串中提取数字

时间:2019-06-07 20:46:51

标签: python regex ansible

我正在尝试从字符串中提取数字。

例如,如果我有字符串'host2',我只希望返回'2'。如果字符串中没有数字,我希望返回“ 1”。

一些示例:

host1 -> 1
ho12st -> 12
host -> 1
host2 -> 2
host2test -> 2
host02 -> 02
host34 -> 34

我不知道是否应该为此使用模块,还是使用内部工作原理并设置一个事实。我有点新手。

类似于以下的内容在python中有效,但不可行。

int(''.join(filter(str.isdigit, {{ ansible_hostname }} )))

这最终在shell上解释,所以我不能使用{{ansible_hostname}}变量。如果没有找到数字,它也不默认为“ 1”。

****回答****

我最终使用它来获得所需的结果:

- set_fact:
        env_id: '{{ server_name | regex_search(qry) }}'
      vars:
        qry: '[0-9]'
    - set_fact:
        env_id: "1"
      when: env_id == ""

1 个答案:

答案 0 :(得分:0)

如果您想使用正则表达式执行此任务,我想我们将只能得到带有数字的数字,并使用简单的表达式,例如:

([0-9]+)

Demo

然后您可以简单地添加一个if,对于没有数字的人返回1

测试

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"([0-9]+)"

test_str = ("host1\n"
    "ho12st\n"
    "host\n"
    "host2\n"
    "host2test\n"
    "host02\n"
    "host34")

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.