使用或不包含小数部分的数字分隔字符

时间:2012-10-20 22:25:01

标签: python regex

我还在学习REGEX,而且我遇到了一个问题......

我正在尝试分隔由十进制格式的字母和数字组合组成的字符串:

AB0.500CD1.05EF2.29

这样的事情:

list1 = AB,CD,EF

list2 = 0.500,1.05,2.29

所有这一切的复杂因素是我也有这样的字符串:

AB1CD2EF3

我还想将其分为:

list1 = AB,CD,EF

list2 = 1,2,3

之前的调查产生了以下代码段

import re
pattern = re.compile(r'([a-zA-Z]+)([0-9]+)')
for (letters, numbers) in re.findall(pattern,cmpnd):
    print numbers
    print letters

此示例适用于第二类字符串,但仅“查找”第一类字符串中包含小数位数的前导数字。

我尝试了使用以下行的方法:

pattern = re.compile(r'([a-zA-Z]+)([0-9]+(\.[0-9]))')

但是这会导致错误:“ValueError:解压缩的值太多了”

感谢您提供的所有帮助!

3 个答案:

答案 0 :(得分:2)

只需在包含数字的字符类中添加一个点:

pattern = re.compile(r'([a-zA-Z]+)([0-9.]+)')

答案 1 :(得分:2)

错误

ValueError: too many values to unpack
生成

是因为您向正则表达式添加了一个新的匹配组

([a-zA-Z]+)([0-9]+(\.[0-9]))
                --^^^^^^^^^--

导致

中的作业数量(即2个作业)不一致
for (letters, numbers) in re.findall(pattern,cmpnd):
  --^^^^^^^^^^^^^^^^^^--

和每组中正则表达式返回的匹配数(即3个匹配项)

for (letters, numbers) in re.findall(pattern,cmpnd):
                        --^^^^^^^^^^^^^^^^^^^^^^^^^--

您可以通过更新解包

轻松解决这些问题
for (letters, numbers, _) in re.findall(pattern, cmpnd):

但你仍然有问题。您的正则表达式不接受没有小数部分的数字。您可以扩展正则表达式,使小数部分的匹配组可选:

([a-zA-Z]+)([0-9]+(\.[0-9])?)
                         --^--

此时代码看起来像这样:

import re
pattern = re.compile(r'([a-zA-Z]+)([0-9]+(\.[0-9])?)')
for (letters, numbers, _) in re.findall(pattern, text):
  print letters, numbers

改进

第三个匹配组未被使用,因为它包含在另一个更大的匹配组中。因此,您可以将此论坛设为不匹配的(?:\.[0-9])?)

import re
pattern = re.compile(r'([a-zA-Z]+)([0-9]+(?:\.[0-9])?)')
for (letters, numbers) in re.findall(pattern, text):
  print letters, numbers

此外,如果您不想强制验证数字格式,您可以简化它。也就是说,接受由任意顺序的连续数字和句点组成的字符串[0-9.]+

import re
pattern = re.compile(r'([a-zA-Z]+)([0-9.]+)')
for (letters, numbers, _) in re.findall(pattern, text):
  print letters, numbers

答案 2 :(得分:0)

尝试这种模式,

[A-Z]{2}(\d+(\.(\d)+)?)

[A-Z]+(\d+(\.(\d)+)?)