我需要检测字符串中的最后一位数字,因为它们是我的字符串的索引。它们可能是2 ^ 64,所以检查字符串中的最后一个元素不方便,然后尝试第二个......等等。
字符串可能类似于asdgaf1_hsg534
,即在字符串中也可能是其他数字,但是在中间某处,它们与我想要的索引不相邻。
答案 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 expression
,replacement string
以及您想要替换的string
:re.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+)
行尾使用 re.match 时,您可以省略 $
锚点,也可以使用 ^
和 \A
来声明 start and the end of the string。
\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+ 个数字获取字符串中的最后一位数字(不一定在字符串的末尾)
(\d+)
^.*?(\d+)[^\r\n\d]*$
行首^
尽可能匹配除换行符以外的任何字符(非贪婪).*?
捕获第 1 组,匹配 1+ 个数字(\d+)
否定字符类,匹配除换行符或数字以外的任何字符 0 次以上[^\r\n\d]*
行尾