gpt4 book ai didi

python - re.findall 行为怪异

转载 作者:IT老高 更新时间:2023-10-28 21:11:47 25 4
gpt4 key购买 nike

源字符串是:

# 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']

最佳答案

这里有两点需要注意:

  • re.findall 如果正则表达式模式包含捕获组,则返回捕获的文本
  • 模式中的 r'\\.' 部分匹配两个连续的字符,\ 和除换行符以外的任何字符。

findall reference :

If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result unless they touch the beginning of another match.

注意要让re.findall只返回匹配值,你通常可以

  • 删除多余的捕获组(例如 (a(b)c) -> abc)
  • 将所有捕获组转换为 non-capturing (也就是说,将 ( 替换为 (?:) 除非 存在引用模式中组值的反向引用(然后见下文)
  • 使用 re.finditer 代替 ([x.group() for x in re.finditer(pattern, s)])

在您的情况下, findall 返回所有捕获的空文本,因为您在 r'' 字符串文字中有 \\ 试图匹配文字 \

要匹配数字,您需要使用

-?\d*\.?\d+

正则表达式匹配:

  • -? - 可选减号
  • \d* - 可选数字
  • \.? - 可选的小数分隔符
  • \d+ - 1 位或多位数字。

demo

这里是 IDEONE demo :

import re
s = r'abc123d, hello 3.1415926, this is my book'
pattern = r'-?\d*\.?\d+'
L = re.findall(pattern, s)
print(L)

关于python - re.findall 行为怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31915018/

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