42

基本上我想知道我会怎么做。

这是一个示例字符串:

string = "hello123"

我想知道如何检查字符串是否以数字结尾,然后打印字符串以数字结尾。

我知道对于这个特定的字符串,您可以使用正则表达式来确定它是否以数字结尾,然后使用 string[:] 选择“123”。但是,如果我正在循环一个带有这样字符串的文件:

hello123
hello12324
hello12435436346

...然后由于数字长度的差异,我将无法使用 string[:] 选择数字。我希望我能清楚地解释我需要什么来帮助你们。谢谢!

4

5 回答 5

63
import re
m = re.search(r'\d+$', string)
# if the string ends in digits m will be a Match object, or None otherwise.
if m is not None:
    print m.group()

\d匹配一个数字,\d+表示匹配一个或多个数字(贪心:匹配尽可能多的连续数字)。并且$表示匹配字符串的结尾。

于 2013-01-23T01:53:57.490 回答
35

这不考虑字符串中间的任何内容,但它基本上表示如果最后一个数字是数字,则它以数字结尾。

In [4]: s = "hello123"

In [5]: s[-1].isdigit()
Out[5]: True

有几个字符串:

In [7]: for s in ['hello12324', 'hello', 'hello1345252525', 'goodbye']:
   ...:     print s, s[-1].isdigit()
   ...:     
hello12324 True
hello False
hello1345252525 True
goodbye False

我完全完全支持正则表达式解决方案,但这里有一种(不漂亮的)方法可以让你得到这个数字。同样,正则表达式在这里要好得多:)

In [43]: from itertools import takewhile

In [44]: s = '12hello123558'

In [45]: r = s[-1::-1]

In [46]: d = [c.isdigit() for c in r]

In [47]: ''.join((i[0] for i in takewhile(lambda (x, y): y, zip(r, d))))[-1::-1]
Out[47]: '123558'
于 2013-01-23T01:50:48.887 回答
6

另一种解决方案:查看您可以去除多少个 0-9 数字字符串的结尾,并将该长度用作字符串的索引以拆分数字。(''如果字符串不以数字结尾,则返回)。

In [1]: s = '12hello123558'

In [2]: s[len(s.rstrip('0123456789')):]
Out[2]: '123558'
于 2017-12-17T21:46:50.690 回答
2

如果字符串以非数字结尾,则此字符串将简单地返回一个空字符串。

import re
re.split('[^\d]', str)[-1]

由于空字符串是falsy,因此您可以重载含义:

def getNumericTail(str):
    re.split('[^\d]', str)[-1]

def endsWithNumber(str):
    bool(getNumericTail(str))
于 2013-01-23T02:04:53.347 回答
0

另一种解决方案:

a = "abc1323"
b = ""
for c in a[::-1]:
    try:
        b += str(int(c))
    except: 
        break

print b[::-1]
于 2013-01-23T01:59:52.313 回答