如何检测python字符串中的最后一位数字

时间:2012-11-20 11:12:31

标签: regex string python-2.7

我需要检测字符串中的最后一位数字,因为它们是我的字符串的索引。它们可能是2 ^ 64,所以检查字符串中的最后一个元素不方便,然后尝试第二个......等等。 字符串可能类似于asdgaf1_hsg534,即在字符串中也可能是其他数字,但是在中间某处,它们与我想要的索引不相邻。

3 个答案:

答案 0 :(得分:4)

以下是使用re.sub的方法:

import re

input = ['asdgaf1_hsg534', 'asdfh23_hsjd12', 'dgshg_jhfsd86']

for s in input:
    print re.sub('.*?([0-9]*)$',r'\1',s)

<强>输出:

534
12
86

<强>解释

该功能需要regular expressionreplacement string以及您想要替换的stringre.sub(regex,replace,string)

正则表达式'.*?([0-9]*)$'匹配整个字符串并捕获字符串结尾之前的数字。括号用于捕获我们感兴趣的匹配部分,\1表示第一个捕获组,\2表示第二个捕获组。

.*?      # Matches anything (non-greedy) 
([0-9]*) # Upto a zero or more digits digit (captured)
$        # Followed by the end-of-string identifier 

所以我们用我们感兴趣的捕获数字替换整个字符串。在python中我们需要使用原始字符串:r'\1'。如果字符串不以数字结尾,则返回空白字符串。


twosixfour = "get_the_numb3r_2_^_64__18446744073709551615"

print re.sub('.*?([0-9]*)$',r'\1',twosixfour)

>>> 18446744073709551615

答案 1 :(得分:0)

一个简单的正则表达式可以检测字符串末尾的数字:

'\d+$'

$匹配字符串的结尾。 \d+匹配一个或多个数字。 +运算符默认情况下是贪心的,这意味着它匹配尽可能多的数字。因此,这将匹配字符串末尾的所有数字。

答案 2 :(得分:0)

如果您想使用 re.sub 并确保行尾至少有一个数字,您可以使用量词 + 来匹配 1 个或多个数字 {{ 1}} 如果没有数字或仅在行尾没有数字,则不删除整行。

\d+
  • ^.*?(\d+)$ 行首
  • ^ 尽可能匹配除换行符以外的任何字符(非贪婪)
  • .*? 捕获第 1 组,匹配 1+ 个数字
  • (\d+) 行尾

或者使用负面回顾

$
  • ^.*(?<!\d)(\d+)$ 行首
  • ^ 尽可能匹配除换行符以外的任何字符
  • .* 直接在左边断言没有数字,然后在第 1 组中捕获 1+ 个数字
  • (?<!\d)(\d+) 行尾

Regex demo

使用 re.match 时,您可以省略 $ 锚点,也可以使用 ^\A 来声明 start and the end of the string

Regex demo

\Z

输出

import re

strings = ['asdgaf1_hsg534', 'asdfh23_hsjd12', 'dgshg_jhfsd86', 'test']

for s in strings:
    print (re.sub(r".*?(\d+)$", r'\1',s))

如果在匹配数字之前应该有一个非数字,如 this comment,您可以使用带有单个捕获组的 negated character class

534
12
86
test
  • ^.*[^\d\r\n](\d+) 行首
  • ^ 尽可能匹配除换行符以外的任何字符
  • .* 否定字符类,匹配除数字或换行符以外的任何字符
  • [^\d\r\n] 捕获第 1 组,匹配 1+ 个数字

Regex demo


获取字符串中的最后一位数字(不一定在字符串的末尾)

(\d+)
  • ^.*?(\d+)[^\r\n\d]*$ 行首
  • ^ 尽可能匹配除换行符以外的任何字符(非贪婪)
  • .*? 捕获第 1 组,匹配 1+ 个数字
  • (\d+) 否定字符类,匹配除换行符或数字以外的任何字符 0 次以上
  • [^\r\n\d]* 行尾

Regex demo