【问题标题】:How to extract exact position using regular expression in python? [duplicate]如何在python中使用正则表达式提取精确位置? [复制]
【发布时间】:2012-08-23 16:15:58
【问题描述】:

可能重复:
Python Regex Use - How to Get Positions of Matches

我是 python 新手。我编写了程序,我使用正则表达式使用命令行参数从网页中提取确切数字。第一个参数应该是“金额”第二个应该是“从”第三个应该是“到”。我应该从站点“@ 987654322@" 应提取转换后的金额。代码是:

import requests
import re
import sys

amount=sys.argv[1]
from_=sys.argv[2]
to=sys.argv[3]
r = requests.get("http://www.xe.com/ucc/convert/?Amount=%(amount)s&From=%(from_)s&To=%(to)s"%{"amount":amount,"from_":from_,"to":to})
dataCrop=re.findall('[0-9,]+\.[0-9]+',r.text)
if amount<'1':
    print dataCrop[15]
else:
    print dataCrop[11]

但问题是我不应该使用确切的位置

if amount<'1':
    print dataCrop[15]
else:
    print dataCrop[11]

相反,我应该修改我的正则表达式。我该如何为此编写正则表达式?我不能用漂亮的汤。

【问题讨论】:

  • 为什么不能使用 BeautifulSoup?
  • “使用条款禁止自动提取费率。”
  • @J.F.Sebastian,不做作业的好借口:)

标签: python regex


【解决方案1】:

re.search 方法返回一个MatchObject。您可以使用它的span 方法来查找匹配的位置。希望这会有所帮助:-)

【讨论】:

  • 我使用 re.search 作为 'dataCrop=re.search(r'[0-9,]+\.[0-9]+',r.text,flags=0)' 和我得到了输出'<_sre.sre_match object at>',然后当我使用'print dataCrop.group(0)'时,我得到了1.0的输出。我没有得到确切的答案。
  • @user1632091 Raymond 的回答是建议您查看dataCrop.span(0) 而不是dataCrop.group(0) 的结果。
【解决方案2】:

在您的情况下,正则表达式匹配的位置不是很有用的信息。尽管正如@Raymond Hettinger 所建议的那样,它可以通过re.MatchObject 轻松访问。

您可以将任务分为三个步骤。

构造网页的url

import sys
import urllib

if len(sys.argv) != 4:
    sys.exit(2)

params = urllib.urlencode(zip("Amount From To".split(), sys.argv[1:]))
url = "http://example.com/path/?" + params

urlencode() 提供sys.argv 的正确编码。

检索网页

from selenium.webdriver import Firefox as Browser # pip install selenium

browser = Browser()
try:
    browser.implicitly_wait(3) # seconds
    browser.get(url)
    page = browser.page_source
finally:
    browser.quit() # quit no matter what

selenium.webdriver 负责处理使用 javascript 生成的页面。

在其中查找相关数据

import re

print re.findall(r'(\d+.\d+).*?"uniq_class_near_data"', page)

如果页面标记更改,它将中断。

这里是BeautifulSoup 变体进行比较:

from bs4 import BeautifulSoup # pip install beautifulsoup4

soup = BeautifulSoup(page)
print [span.find_previous_sibling(text=re.compile(r'\d+.\d+')).strip()
       for span in soup('span', class_="uniq_class_near_data", limit=2)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2021-06-27
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    相关资源
    最近更新 更多