【问题标题】:Python regex to match integers but not floatsPython正则表达式匹配整数但不匹配浮点数
【发布时间】:2015-03-17 19:21:00
【问题描述】:

我需要一个 Python 正则表达式来匹配整数,但 不是 从字符串输入中浮动。

以下正则表达式使用否定的前瞻和否定的后瞻来确保数字既不在前面也不在后面跟着'.'。

(?<!\.)[0-9]+(?!\.)

它仅适用于个位数的浮点数。例如

int_regex = re.compile("(?<!\.)[0-9]+(?!\.)")
str_int_list = int_regex.findall(text)

Correct when no more than 1 digit on each side of a float:

"1 + 2 + 3.0 + .4 + 5. + 66 + 777" --> ['1', '2', '66', '777']

Incorrectly matches the '1' of '12.3' and the '5' of '.45'.

"12.3 + .45 + 678" --> ['1', '5', '678']

问题似乎是正则表达式中间的[0-9]+不够贪心。

我尝试在前瞻和后视中添加数字匹配,但在 Python 错误中遇到了“后视需要是恒定长度”错误。

任何关于如何只匹配整数而不匹配浮点数的建议将不胜感激。

【问题讨论】:

  • 整数总是被空格包围吗?为什么.4 是整数?
  • .4 不是整数,我不想匹配它(如示例所示)。

标签: python regex


【解决方案1】:

由于负后瞻和前瞻不允许点,因此正则表达式引擎在确实遇到点时简单地回溯一位,导致正则表达式仅匹配数字的一部分.

为防止这种情况,请在外观中添加数字:

(?<![\d.])[0-9]+(?![\d.])

或使用边界\b

(?<!\.)\b[0-9]+\b(?!\.)

【讨论】:

  • 非常感谢,我的错误是将[0-9]+ 添加到环顾四周。现在都整理好了。 :)
【解决方案2】:

只需将\d 添加到前瞻和后瞻模式:

import re

int_regex = re.compile("(?<!\.)[0-9]+(?!\.)")
re2 = re.compile("(?<![\.\d])[0-9]+(?![\.\d])")

text = "1 + 2 + 3.0 + .4 + 5. - .45 + 66 + 777 - 12.3"
print "int_regex:", int_regex.findall(text)
print "re2      :", re2.findall(text)

int_regex: ['1', '2', '5', '66', '777', '1']
re2      : ['1', '2', '66', '777']

lookahead/behind 模式定义了一个数字边界(很像 \b 定义一个单词边界),并且您唯一允许的数字是数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    相关资源
    最近更新 更多