小数点之前和/或之后的数字

2024-03-29 01:14:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将模式digits.digitsdigits.[digits][digits].digits与Python中的regex进行匹配。你知道吗

源代码:Postgres docs状态比数值常量可以采用以下任何形式:

digits
digits.[digits][e[+-]digits]
[digits].digits[e[+-]digits]
digitse[+-]digits

其中括号表示可选性,digits是一个或多个数字,0-9。你知道吗

我想匹配这个语法的一小部分

digits.[digits]
[digits].digits

换句话说,小数点之前或之后必须至少有一个数字。(或,前后)

从字符串numbers = '.42 5.42 5. .',对re.findall(regex, numbers)的调用应该返回['.42', '5.42', '5.']。你知道吗

我尝试的是if-then条件,(?(id/name)yes-pattern|no-pattern)

regex = r'(\d+)?(?(1)\.\d*|\.\d+)'

问题是,这要求捕获组(1)引用,而re.findall(r'(\d+)?(?(1)\.\d*|\.\d+)', numbers)给出['', '5', '5'],因为它正在捕获捕获组。你知道吗

请暂时忽略单词边界、前导零、指数符号等。天真的正则表达式应该是:

regex = r'\d+\.\d*|\d*\.\d+'

但是随着语法复杂性的增长,我不希望只将|单独的正则表达式放在一起。你知道吗

我如何构造它使re.findall(regex, numbers)返回上面的列表?你知道吗


Tags: redocs源代码状态模式语法数字postgres
1条回答
网友
1楼 · 发布于 2024-03-29 01:14:29

虽然您可以将regex与re.finditer一起使用,以获得第一个包含每个完整匹配值([x.group(0) for x in re.finditer(regex, numbers)])的组,但您也可以使用regex获得所需的值

re.findall(r'(?=\.?\d)\d*\.\d*', s)

参见regex demo

细节

  • (?=\.?\d)-一个正向的向前看,需要一个可选的.,后面紧跟着当前位置右侧的一个数字
  • \d*-0+位
  • \.-一个点
  • \d*-0+位

因此,尽管消费模式中的\d*可以匹配0位数字,但lookahead至少需要一位数字。你知道吗

Python demo

import re
s=".42 5.42 5. ."
print(re.findall(r'(?=\.?\d)\d*\.\d*', s))
# => ['.42', '5.42', '5.']

相关问题 更多 >