从字符串中提取数字

Extract Digits from String

我正在尝试从 unicode 字符串中提取数字。该字符串看起来像 raised by 64 backersraised by 2062 backers。我尝试了很多不同的方法,但以下代码是唯一有效的代码。

backers = browser.find_element_by_xpath('//span[@gogo-test="backers"]').text
match = re.search(r'(\d+)', backers)
print(match.group(0))

因为我不确定我需要多久从字符串中提取子字符串,而且我不想创建大量额外的变量和代码行,所以我想知道是否有更短的方法要做到这一点?

我知道我可以做这样的事情。

def extract_digits(string):
    return re.search(r'(\d+)', string)

但我希望只有一个衬里,这样我就可以在不使用像这样的附加函数的情况下构建脚本。

backers = ...
title = ...
description = ...
...

尽管它显然不起作用,但我想做类似下面的事情,但它没有按预期工作。

backers = re.search(r'(\d+)', browser.find_element_by_xpath('//span[@gogo-test="backers"]').text)

输出如下所示。

<_sre.SRE_Match object at 0x000000000542FD50>

有什么办法可以解决这个问题吗?!

你可以试试这个:

number = backers.findall(r'\b\d+\b', 'raised by 64 backers')

输出:

64

所以方法可以是这样的:

def extract_digits(string):
    return re.findall(r'\b\d+\b', string)

演示版 here

编辑: 因为你想要一行中的所有内容,试试这个:

import re

backers = re.findall(r'\b\d+\b', browser.find_element_by_xpath('//span[@gogo-test="backers"]').text)[0]

PS:

搜索 ⇒ 在字符串中的任何地方找到一些东西并且 return 一个 match 对象
findall ⇒ 在字符串和 return 列表中的任何位置查找内容。

文档:

Scan through string looking for the first location where the regular expression pattern produces a match, and return a corresponding MatchObject instance. Return None if no position in the string matches the pattern; note that this is different from finding a zero-length match at some point in the string.

文档 link:docs.python.org/2/library/re.html

所以要对 search 做同样的事情,请使用:

backers = re.search(r'(\d+)', browser.find_element_by_xpath('//span[@gogo-test="backers"]').text).group(0)

作为一个选项,您可以跳过使用正则表达式并使用内置 Python isdigit()(不需要额外导入):

digit = [sub for sub in browser.find_element_by_xpath('//span[@gogo-test="backers"]').text.split() if sub.isdigit()][0]