【问题标题】:Transforming findall regex to finditer将 findall 正则表达式转换为 finditer
【发布时间】:2017-01-06 14:25:34
【问题描述】:

我有以下正则表达式

'\D*(\d{13,19})\D*'

我想从以下文本中提取数字:

Data:
4532394639182605   sadada 4716759060363635 assasasas
  dsdsd 4539072249615668 jdhsjhdj
ABCD

当我通过调用使用这个正则表达式时:

regex = re.compile('\D*(\d{13,19})\D*')
a = regex.finditer(text)
b = regex.findall(text) #Yield correct result

结果不同 - 我想要来自 findall 的结果。我知道finditer 匹配组。但是如何将我的 findall 正则表达式转换为 finditer 正则表达式?

我需要使用 finditer 获得相同的结果,例如使用 findall

tl;dr

我想提取数字而不是其他字符。

【问题讨论】:

  • finditer 返回一个与列表不同的迭代器。当您迭代 ab 时,您会得到不同的结果吗?
  • 只有我感兴趣的东西是输出——我想提取数字。是的结果不同
  • @user902691 你的问题不清楚。你想达到什么目的?请在问题中包含完整的上下文。你想让finditer 表现得像findall 是没有意义的。
  • @MYGz 我只想使用finditer 从文本中提取数字。我需要更改我的正则表达式,当前的正则表达式仅在 findall 中像魅力一样工作。
  • @user902691 finditer 也可以像魅力一样工作,只需对其进行迭代。 [x.group(0) for x in a]

标签: python regex python-2.7


【解决方案1】:

finditer 返回匹配对象,可以使用.group 方法从中提取组。无论如何,这就是通常使用正则表达式的方式,findall 直接返回带有组的字符串或元组是不寻常的。

import re

text = '''Data:
4532394639182605   sadada 4716759060363635 assasasas
  dsdsd 4539072249615668 jdhsjhdj
ABCD'''

regex = re.compile('\D*(\d{13,19})\D*')
for match in regex.finditer(text):
    print(match.group(1))

【讨论】:

    猜你喜欢
    • 2017-01-18
    • 2011-10-02
    • 2016-04-02
    • 1970-01-01
    • 2019-05-11
    • 2014-11-08
    • 2017-12-29
    • 2023-03-09
    相关资源
    最近更新 更多