【问题标题】:Regular Expression for whole numbers and integers?整数和整数的正则表达式?
【发布时间】:2013-05-22 08:42:14
【问题描述】:

我正在尝试从字符串中检测所有整数和整数(以及许多其他内容)。以下是我目前使用的正则表达式:

整数:r"[0-9]+"

整数:r"[+,-]?[0-9]+"

以下是问题:

  1. 整数正则表达式也在检测负数,这是我无法检测到的。我该如何解决这个问题?如果我在正则表达式开始之前使用空格,我只会得到正数,但我会在输出开始时得到一个空格!
  2. 对于整数,我想检测格式为 +[0-9] 的正数,但不带符号存储它们。
  3. 对于整数,我想存储任何用符号检测到的正整数,无论​​它是否存在于原始字符串中。

现在差不多完成了: 最后一件事,我有一个字符串,上面写着“加 10 和 -15”。我想将整数存储在列表中。我这样做是使用 findall()。存储数字时,可以将“10”存储为“+10”

【问题讨论】:

  • “整数”和“正整数”不是一回事吗?我不明白你会如何区分它们。
  • 整数和整数是一回事。正整数是自然数。
  • 你想在字符串"1.0 and 1e7"中匹配什么?两者都是数字(但被 Python 视为floats)。
  • @Cairnarvon 哦,对了。虽然这似乎与 OP 的用法不符(如问题 #2)
  • 您的第三个愿望仅靠正则表达式是不可能实现的。正则表达式只能匹配字符串中已经存在的文本。

标签: python regex


【解决方案1】:

对于正整数,使用

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

说明:

(?<![-.])   # Assert that the previous character isn't a minus sign or a dot.
\b          # Anchor the match to the start of a number.
[0-9]+      # Match a number.
\b          # Anchor the match to the end of the number.
(?!\.[0-9]) # Assert that no decimal part follows.

对于有符号/无符号整数,使用

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

单词边界\b对于确保整个数字匹配至关重要。

【讨论】:

  • 非常感谢。界限非常有帮助。
  • 现在差不多完成了:最后一件事,我有一个字符串,上面写着“加 10 和 -15”。我想将整数存储在列表中。我这样做是使用 findall()。存储数字时,可以将“10”存储为“+10”
  • 正如我在对您的问题的评论中提到的,这是不可能的。正则表达式只能匹配已经存在的文本,它不能在匹配中添加任何内容。您需要以编程方式执行此操作。
  • 这在 10.23 之类的东西上失败了。我认为您也需要在开头添加 . 检查。
  • 在数字后检查单个点是有问题的,不是吗? “将 10 和 12 相加。然后将结果乘以 17。”
【解决方案2】:

你几乎拥有它。

import re

regex = re.compile(r'(\d+)|([\+-]?\d+)')

s = "1 2 3 4 5 6 +1 +2 +3 -1 -2 -3 +654 -789 321"
for r in regex.findall(s):
    if r[0]:
        # whole (unsigned)
        print 'whole', r[0]
    elif r[1]:
        # a signed integer
        print 'signed', r[1]

结果:

>>> 
whole 1
whole 2
whole 3
whole 4
whole 5
whole 6
signed +1
signed +2
signed +3
signed -1
signed -2
signed -3
signed +654
signed -789
whole 321

或者,您可以使用“或”以“更好”的方式获得实际结果:

print [r[0] or r[1] for r in regex.findall(s)]
>>> 
['1', '2', '3', '4', '5', '6', '+1', '+2', '+3', '-1', '-2', '-3', '+654', '-789', '321']

编辑: 根据您的问题“is it possible to store '10' as '+10'”:

import re

def _sign(num):
    if r[0]:
        return '+%s'%r[0]
    else:
        return r[1]

regex = re.compile(r'(\d+)|([\+-]?\d+)')
s = "1 2 3 4 5 6 +1 +2 +3 -1 -2 -3 +654 -789 321"      
print [_sign(r) for r in regex.findall(s)]
>>>
['+1', '+2', '+3', '+4', '+5', '+6', '+1', '+2', '+3', '-1', '-2', '-3', '+654', '-789', '+321']

或在 1 行中:

print ['+%s'%r[0] if r[0] else r[1] for r in regex.findall(s)]
>>> 
['+1', '+2', '+3', '+4', '+5', '+6', '+1', '+2', '+3', '-1', '-2', '-3', '+654', '-789', '+321']

【讨论】:

  • 现在差不多完成了:最后一件事,我有一个字符串,上面写着“加 10 和 -15”。我想将整数存储在列表中。我这样做是使用 findall()。存储数字时,可以将“10”存储为“+10”
  • 谢谢,我只需要知道是否可以在提取正则表达式且不使用显式函数的情况下完成。无论如何,谢谢!
  • 你可以看到我的答案的最后一行都在一行中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多