【问题标题】:How to exclude newline mark from requests.get().text如何从 requests.get().text 中排除换行符
【发布时间】:2016-07-19 20:01:30
【问题描述】:

我正在尝试使用以下代码从站点响应 http://app.lotto.pl/wyniki/?type=dl 中删除数字

import requests
import re

url = 'http://app.lotto.pl/wyniki/?type=dl'
p = re.compile(r'[^\d{4}\-\d{2}\-\d{2}]\d+')

response = requests.get(url)
data = re.findall(p, response.text)
print(data)

但是我得到的是['\n7', '\n46', '\n8', '\n43', '\n9', '\n47'] 而不是['7', '46', '8', '43', '9', '47'] 我怎样才能摆脱"\n"

【问题讨论】:

  • 你把一个序列放到一个字符类中,这意味着你不确定你写的模式是什么意思。你的意图是什么?
  • data = [x.strip() for x in re.findall(p, response.text)]
  • @WiktorStribiżew 只想从网站获取数字,但简单的响应如下所示:2016-03-29 7 46 8 43 9 47
  • 来吧,你为什么不直接使用re.findall(r'(?<!-)\b\d+\b(?!-)', response.text)?见demo
  • 谢谢。我只是业余爱好者,所以我还在学习。

标签: regex python-3.x python-requests newline


【解决方案1】:

您的正则表达式不合适,因为[^\d{4}\-\d{2}\-\d{2}]\d+ 匹配除数字之外的任何字符,{4}-2,然后是 1 个或多个数字。换句话说,你把一个序列变成了一个字符集否定字符类可以匹配换行符。它也可以匹配任何字母。还有更多。 strip 在其他情况下无济于事,您需要修复正则表达式。

使用

r'(?<!-)\b\d+\b(?!-)'

regexIDEONE demo

此模式将匹配前面没有连字符 ((?&lt;!-)) 或任何单词字符 (\b) 并且后面没有单词字符 (\b) 或连字符 (-)。

您的代码将如下所示:

import requests
import re

url = 'http://app.lotto.pl/wyniki/?type=dl'
p = re.compile(r'(?<!-)\b\d+\b(?!-)')

response = requests.get(url)
data = p.findall(response.text)
print(data)

【讨论】:

  • 谢谢。有效。事实上,在更改正则表达式后,我不必使用 strip
【解决方案2】:

您可以使用strip() 函数剥离\n

data = [x.strip() for x in re.findall(p, response.text)]

我假设\n 可以在开头也可以在结尾

【讨论】:

  • 它只适用于当前输入。如果数字出现在稍微不同的上下文中,问题将仍然存在。问题出在正则表达式中。
  • @WiktorStribiżew 我没有阅读正则表达式。认为这是更简单的问题。我的错。为您的解决方案 +1
【解决方案3】:

由于您的数字是字符串,您可以轻松地使用lstrip() 方法处理字符串。这种方法确实会删除字符串左侧的换行符/回车符(这就是 lstrip 的原因)。
您可以尝试类似

print([item.lstrip() for item in data])

删除你的换行符。

或者您也可以使用剥离后的自身版本覆盖data

data=[item.lstrip() for item in data]

然后简单地print(data)

【讨论】:

    猜你喜欢
    • 2023-02-08
    • 1970-01-01
    • 2012-11-05
    • 2012-06-20
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2013-10-06
    相关资源
    最近更新 更多