gpt4 book ai didi

Python 正则表达式查找所有匹配项

转载 作者:太空宇宙 更新时间:2023-11-04 02:54:22 25 4
gpt4 key购买 nike

我正在使用 python 2.7 re 库查找字符串中以科学形式编写的所有数字。我正在使用以下代码:

import re
y = re.findall(".([0-9]+\.[0-9]+[eE][-+]?[0-9]+).","{8.25e+07|8.26206e+07}")
print y

但是,输出只是 ['8.25e+07'] 而我期待的是 [('8.25e+07'),(8.26206e+07) ]。我一直在尝试,但找不到问题出在哪里。如果我输入 y = re.findall(".([0-9]+\.[0-9]+[eE][-+]?[0-9]+).","|8.26206 e+07}") 然后它给出 ['8.26206e+07'] 所以模式匹配第二个数字但我不明白为什么它不匹配两个同时。

最佳答案

您通过滥用 . 匹配任何字符但实际上并不需要它并使用捕获组 () 而没有真正使用它,使您的正则表达式稍微过于复杂。

对于您的模式,您正在寻找一个科学记数法中的数字,该数字的前后都必须恰好有一个字符。

{8.25e+07|8.26206e+07}
[--------]

re.findall 从头开始​​遍历您的字符串后,它会找到您定义的模式,然后删除 {| 因为您的捕获组 (..) 并将其保存为匹配项。然后继续,但只剩下 8.26206e+07}。那现在不满足您的模式,因为您的第一个 . 缺少一个“任何”字符,并且找不到进一步的匹配项。请注意,findall 仅查找非重叠匹配项[1]。

为了说明,通过复制分隔符 | 来更改输入字符串:

>>> p = ".([0-9]+\.[0-9]+[eE][-+]?[0-9]+)."
>>> s = "{8.25e+07||8.26206e+07}"
>>> print(re.findall(p, s))
['8.25e+07', '8.26206e+07']

为了满足您的两个 .,您需要在任意两个数字之间使用两个分隔符。

我会在您的模式中更改两件事,(1) 删除 . 和 (2) 删除您的捕获组 ( ) ,你不需要它:

p = "[0-9]+\.[0-9]+[eE][-+]?[0-9]+"

如果您稍后需要再次引用特定的捕获组,捕获组会非常有用,但您手头的任务不需要它们。

[1] https://docs.python.org/2/library/re.html?highlight=findall#re.findall

关于Python 正则表达式查找所有匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42893268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com