我还在学习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:解压缩的值太多了”
感谢您提供的所有帮助!
答案 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)+)?)