当前位置: 首页 > 面试题库 >

Python-re.findall表现怪异

奚翰海
2023-03-14
问题内容

源字符串为:

# Python 3.4.3
s = r'abc123d, hello 3.1415926, this is my book'

这是我的模式

pattern = r'-?[0-9]+(\\.[0-9]*)?|-?\\.[0-9]+'

但是,re.search可以给我正确的结果:

m = re.search(pattern, s)
print(m)  # output: <_sre.SRE_Match object; span=(3, 6), match='123'>

re.findall 只是转储一个空列表:

L = re.findall(pattern, s)
print(L)  # output: ['', '', '']

为什么不能re.findall给我期望的清单:

['123', '3.1415926']

问题答案:
s = r'abc123d, hello 3.1415926, this is my book'
print re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s)

使用原始模式时,你无需两次逃脱。

输出:['123', '3.1415926']

同样,返回类型将是字符串列表。如果要将返回类型设置为整数和浮点数,请使用map

import re,ast
s = r'abc123d, hello 3.1415926, this is my book'
print map(ast.literal_eval,re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s))

输出: [123, 3.1415926]



 类似资料:
  • 问题内容: 我有代码: 这返回 如果我们有 我们得到 为什么有区别?为什么(第一次)没有区别? 谢谢! 问题答案: 让我解释一下您在做什么: 您正在创建一个正则表达式,它将查找或,然后尝试查找是否还有更多或之后的内容,并且它将一直寻找或直到找不到为止。因为您希望捕获组仅返回,否则您只会得到最后一个捕获/找到的组。 但是,如果你有一个这样的字符串:你会得到,因为你在字符串先来看看,找到,然后你看多了

  • 问题内容: 所以我有这个临时字符串,基本上是字符串格式的列表。。。我正在尝试将其重新列出,但是我不确定这样做的简单方法。我知道一种方法,但我宁愿不使用正则表达式 如果我使用temp.split()我得到 问题答案: 用途: 安全地评估表达式节点或包含Python表达式的Unicode或Latin-1编码的字符串。提供的字符串或节点只能由以下Python文字结构组成:字符串,数字,元组,列表,字典,

  • 问题内容: 这仅返回结果,我需要返回全部89%。有任何想法如何做吗? 问题答案: 简单的解决方案: 更漂亮的解决方案: 最漂亮的解决方案:

  • 问题内容: 我不了解python中列表的行为: 为什么一个元素的分配影响另一个元素?感谢您的回答! 问题答案: 当您将一个列表相乘时,它会复制对该列表的引用,但不会创建该列表的副本。由于列表是可变的,因此在更改列表时,所有对其引用的引用都会更改。 用ASCII术语来说: 您可以清楚地看到更改list3将同时影响两个位置。 如果要创建可变长列表而不复制引用,则应执行以下操作: 在这里,我们使用列表理

  • 问题内容: 我有这段代码: 但我得到的结果是: 当然,我期望低于20的数字不会出现在结果中,我假设我对删除操作做错了什么。 问题答案: 在遍历列表时,你正在修改它。这意味着第一次遍历循环时,i==1,因此1从列表中删除。然后for循环转到列表中的第二项,不是2,而是3!然后从列表中删除,然后for循环转到列表中的第三项,现在是5。等等。也许这样更容易想象,用表示的值: 最初是列表的状态;然后删除1

  • 问题内容: 这里发生了什么?如何转换为字符串并将结果值转换为浮点数? 我在Windows上使用Python 2.5.4。 问题答案: 给予并且可以。这是由于表示浮点数的方式(请参阅此Wikipedia文章) 注意:或会给您预期的结果,但如果需要精度,则应使用Decimal。