28

我对 python 和正则表达式很陌生(这里是正则表达式新手),我有以下简单的字符串:

s=r"""99-my-name-is-John-Smith-6376827-%^-1-2-767980716"""

我想只提取上面字符串中的最后一个数字,即 767980716,我想知道如何使用 python 正则表达式来实现这一点。

我想做类似的事情:

re.compile(r"""-(.*?)""").search(str(s)).group(1)

表示我想在 (.*?) 之间找到以“-”开头并以字符串结尾结束的东西 - 但这什么也不返回。

我想知道是否有人能指出我正确的方向。谢谢。

4

7 回答 7

39

您可以使用re.match仅查找字符:

>>> import re
>>> s=r"""99-my-name-is-John-Smith-6376827-%^-1-2-767980716"""
>>> re.match('.*?([0-9]+)$', s).group(1)
'767980716'

或者,re.finditer也可以:

>>> next(re.finditer(r'\d+$', s)).group(0)
'767980716'

所有正则表达式组件的解释:

  • .*?一个非贪婪匹配,并且只消耗尽可能多的东西(贪婪匹配会消耗除最后一位之外的所有内容)。
  • [0-9]并且\d是捕获数字的两种不同方式。请注意,后者也匹配其他书写方案中的数字,例如 ୪ 或 ൨。
  • 括号 ( ()) 使表达式的内容成为一个组,可以使用group(1)(或 2 表示第二组,0 表示整个匹配)检索该组。
  • +表示多个条目(最后至少有一个数字)。
  • $仅匹配输入的结尾。
于 2012-11-22T19:21:20.340 回答
8

很好很简单findall

import re

s=r"""99-my-name-is-John-Smith-6376827-%^-1-2-767980716"""

print re.findall('^.*-([0-9]+)$',s)

>>> ['767980716']

正则表达式解释:

^         # Match the start of the string
.*        # Followed by anthing
-         # Upto the last hyphen
([0-9]+)  # Capture the digits after the hyphen
$         # Upto the end of the string

或者更简单地匹配字符串末尾的数字 '([0-9]+)$'

于 2012-11-22T19:21:58.030 回答
7

Regex应该是(\d+)$

  • \d+用于匹配数字(一个或多个)
  • $用于匹配字符串的末尾。

所以,你的代码应该是: -

>>> s = "99-my-name-is-John-Smith-6376827-%^-1-2-767980716"
>>> import re
>>> re.compile(r'(\d+)$').search(s).group(1)
'767980716'

而且你不需要str在这里使用函数,因为s它已经是一个字符串。

于 2012-11-22T19:20:42.887 回答
4

使用下面的正则表达式

\d+$

$描绘了字符串的结尾..

\d是一个数字

+匹配前面的字符 1 到多次

于 2012-11-22T19:20:35.133 回答
4

将正则表达式保存为需要更繁重的工作。

>>> def parse_last_digits(line): return line.split('-')[-1]
>>> s = parse_last_digits(r"99-my-name-is-John-Smith-6376827-%^-1-2-767980716")
>>> s
'767980716'
于 2012-11-22T21:39:11.313 回答
3

我一直在玩这些解决方案中的几个,但如果字符串末尾没有数字,很多似乎都失败了。以下代码应该可以工作。

import re

W = input("Enter a string:")
if re.match('.*?([0-9]+)$', W)== None:
    last_digits = "None"
else:
    last_digits = re.match('.*?([0-9]+)$', W).group(1)
print("Last digits of "+W+" are "+last_digits)
于 2020-04-25T03:59:52.573 回答
2

尝试\d+$改用。匹配一个或多个数字字符,后跟字符串的结尾。

于 2012-11-22T19:20:58.140 回答