【问题标题】:How can I detect last digits in python string如何检测python字符串中的最后一位数字
【发布时间】:2012-11-20 11:12:30
【问题描述】:

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

【问题讨论】:

  • 你有没有尝试写点什么?
  • 你能发布一个示例输入/输出吗?
  • 我有字符串作为输入,我必须将字符串中的最后一位数字作为参数传递给其他函数。所以我需要解析这些字符串并获取最后一位数字。字符串就像问题中一样 - “asdgaf1_hsg534”、“asdfh23_hsjd12”、“dgshg_jhfsd86”等。对于提到的字符串,我需要从提到的字符串中获取 534、12 和 86
  • 我刚刚写了一个答案并删除了它。你真的应该自己尝试一下。这对初学者来说是个好习惯:)
  • 5 3 和 4 是字符串中的最后一位

标签: regex string python-2.7


【解决方案1】:

这是一个使用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

【讨论】:

    【解决方案2】:

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

    '\d+$'
    

    $ 匹配字符串的结尾。 \d+ 匹配一位或多位数字。 + 运算符默认是贪婪的,这意味着它匹配尽可能多的数字。所以这将匹配字符串末尾的所有位数字。

    【讨论】:

    • 感谢您的帮助。我做到了: is_match = re.match(r'(.*)(\D)(\d+)', myString) if is_match: print is_match.group(3) 它有效
    【解决方案3】:

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

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

    或使用负面的后视

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

    Regex demo

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

    Regex demo

    import re
    
    strings = ['asdgaf1_hsg534', 'asdfh23_hsjd12', 'dgshg_jhfsd86', 'test']
    
    for s in strings:
        print (re.sub(r".*?(\d+)$", r'\1',s))
    

    输出

    534
    12
    86
    test
    

    如果在匹配this comment 中的数字之前应该存在非数字,则可以将negated character class 与单个捕获组一起使用。

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

    Regex demo


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

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

    Regex demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 2020-12-23
      • 2021-12-19
      • 2019-09-09
      • 2013-11-26
      • 1970-01-01
      相关资源
      最近更新 更多