使用正则表达式从字符串中提取数字

3

我有如下字符串:

fname="VDSKBLAG00120C02 (10).gif"

我该如何使用re从字符串fname中提取值10

3个回答

7
一个更简单的正则表达式是\((\d+)\)
regex = re.compile(r'\((\d+)\)')
value = int(re.search(regex, fname).group(1))

6
regex = re.compile(r"(?<=\()\d+(?=\))")
value = int(re.search(regex, fname).group(0))

说明:

(?<=\() # Assert that the previous character is a (
\d+     # Match one or more digits
(?=\))  # Assert that the next character is a )

2
似乎有点过于复杂了。为什么不直接使用\((\d+)\)呢? - Daniel Roseman
@DanielRoseman:请给出一个正式的答案。我也更喜欢那个解决方案。 - Janus Troelsen
使用Daniel的方法:int(re.compile(r"\((\d+)\)").search("VDSKBLAG00120C02 (10).gif").group(1)) - Janus Troelsen
@DanielRoseman:我猜这只是个人偏好问题。这个正则表达式直接对应了 OP 的要求:“匹配被括号包围的数字”。你的正则表达式则是“匹配包围数字的一对括号”,然后你需要从中提取数字。最终两者都能达到相同的效果。 - Tim Pietzcker
1
优点在于您可以使用相同的表达式进行搜索和替换。 - georg
显示剩余2条评论

0

个人而言,我会使用这个正则表达式:

^.*\(\d+\)(?:\.[^().]+)?$

通过这个方法,我可以选择括号中的最后一个数字,就在扩展名之前(如果有的话)。 如果文件名中间有任何随机数字,它不会选择任何随机数字。 例如,它应该正确地从SomeFilmTitle.(2012).RippedByGroup (2).avi中选择出2。唯一的缺点是,当数字紧挨着扩展名时,它无法区分:SomeFilmTitle (2012).avi

我假设文件的扩展名(如果有)不应包含()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接