0

我还在学习正则表达式,我遇到了一个问题......

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

AB0.500CD1.05EF2.29

变成这样:

list1 = AB,CD,EF

list2 = 0.500,1.05,2.29

所有这一切的复杂之处在于我也有看起来像这样的字符串:

AB1CD2EF3

我也想把它分成:

list1 = AB,CD,EF

列表2 = 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: too many values to unpack”

感谢您的任何帮助!

4

3 回答 3

2

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

pattern = re.compile(r'([a-zA-Z]+)([0-9.]+)')
于 2012-10-20T22:29:03.770 回答
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
于 2012-10-20T22:54:33.750 回答
0

试试这个模式,

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

或者

[A-Z]+(\d+(\.(\d)+)?)
于 2012-10-20T22:27:48.603 回答