我想将模式digits.digits
、digits.[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)
返回上面的列表?你知道吗
虽然您可以将regex与
re.finditer
一起使用,以获得第一个包含每个完整匹配值([x.group(0) for x in re.finditer(regex, numbers)]
)的组,但您也可以使用regex获得所需的值参见regex demo
细节
(?=\.?\d)
-一个正向的向前看,需要一个可选的.
,后面紧跟着当前位置右侧的一个数字\d*
-0+位\.
-一个点\d*
-0+位因此,尽管消费模式中的
\d*
可以匹配0位数字,但lookahead至少需要一位数字。你知道吗Python demo:
相关问题 更多 >
编程相关推荐