【问题标题】:Extract Digits from String [duplicate]从字符串中提取数字[重复]
【发布时间】:2018-12-14 15:23:54
【问题描述】:

我正在尝试从 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>

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

【问题讨论】:

  • titledescription 来自哪里?如果您能提供一些输入和预期的输出,那就更好了。
  • @AshishAcharya 你不需要担心titledescription,这只是为了简单地展示我希望如何在不使用附加函数的情况下构造我的代码,理想情况下
  • @Anthony,正则表达式 raised by (.*) backers 只提取数字怎么样?可能像import re re.match(r"raised by (.*) backers", string)

标签: python regex string selenium extract


【解决方案1】:

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

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

【讨论】:

  • 为什么 backers = re.search(r'(\d+)', browser.find_element_by_xpath('//span[@gogo-test="backers"]').text)[0]backers = re.search(r'(\d+)', browser.find_element_by_xpath('//span[@gogo-test="backers"]').text)(0) 或类似的东西不起作用,但你的和其他朋友的答案如此相似?
  • AFAIK backers = re.search(r'(\d+)', browser.find_element_by_xpath('//span[@gogo-test="backers"]').text)[0] 实际上也应该工作......
  • @Andersson 不应该是group(0),请看我的回答
  • 我会在我醒来的时候尝试backers = re.search(r'(\d+)', browser.find_element_by_xpath('//span[@gogo-test="backers"]').text).group(0) tomo 如果可行的话!
  • @AndreiSuvorkov , [0] 应该也能正常工作
【解决方案2】:

你可以试试这个:

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:

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

文档:

扫描字符串寻找第一个位置 表达式模式产生一个匹配,并返回一个对应的 匹配对象实例。如果字符串中没有位置匹配,则返回 None 图案;请注意,这与查找零长度不同 匹配字符串中的某个点。

文档链接: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)

【讨论】:

  • 我马上试试。我不需要 import re 这样做吗?
  • 不过,我更愿意将所有内容都放在一个声明中。类似于:backers = browser.find_element_by_xpath('//span[@gogo-test="backers"]').text.findall(r'\b\d+\b', string) 尽管我知道那不是一回事
  • 如果有必要在一个字符串中执行此操作,我认为您也可以执行此操作。但这对读者来说不是很好
  • 我已经编辑了我的问题。我试过这样做,但它没有按预期工作
  • backers = re.search(r'(\d+)', browser.find_element_by_xpath('//span[@gogo-test="backers"]').text) 的输出是<_sre.SRE_Match object at 0x000000000542FD50> :..(
猜你喜欢
  • 2017-02-17
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2017-09-24
  • 2018-06-11
  • 1970-01-01
  • 2012-06-15
  • 2018-08-30
相关资源
最近更新 更多