0

我正在尝试使用正则表达式替换列表中的可变长度项目。例如,此项“HD479659”应替换为“HD0000000479659”。我只需要在两者之间插入 7 个 0。我制作了以下程序,但每次运行它时都会出现以下错误:“TypeError:'_sre.SRE_Pattern' 类型的对象没有 len()”。你能帮我解决这个错误吗?

非常感谢你

这是程序

import xlrd  
import re
import string

wb = xlrd.open_workbook("3_1.xls") 

sh = wb.sheet_by_index(0) 

outfile=open('out.txt','w')


s_pat=r"HD[1-9]{1}[0-9]{5}"

s_pat1=r"HD[0]{7}[0-9]{6}"

pat = re.compile(s_pat) 

pat1 = re.compile(s_pat1)



for rownum1 in range(sh.nrows): 

  str1= str(sh.row_values(rownum1))

  m1=[]

  m1 = pat.findall(str1)

  m1=list(set(m1))

  for a in m1:

      a=re.sub(pat,pat1,a)

  print >> outfile, m1
4

2 回答 2

2

我认为您的解决方案非常复杂。这个应该可以完成这项工作,而且要简单得多:

import re

def repl(match):
    return match.group(1) + ("0"*7) + match.group(2)

print re.sub(r"(HD)([1-9]{1}[0-9]{5})", repl, "HD479659")

另见:http ://docs.python.org/library/re.html#re.sub

更新:

要转换值列表,您必须遍历所有值。您不必先搜索匹配值:

import re

values_to_transform = [
    'HD479659',
    'HD477899',
    'HD423455',
    'does not match',
    'but does not matter'
]

def repl(match):
    return match.group(1) + ("0"*7) + match.group(2)

for value in values_to_transform:
    print re.sub(r"(HD)([1-9]{1}[0-9]{5})", repl, value)

结果是:

HD0000000479659
HD0000000477899
HD0000000423455
does not match
but does not matter
于 2012-10-13T10:09:10.147 回答
0

您需要做的是显式提取 ID 的可变长度部分,然后根据所需长度填充 0 - 匹配长度。

如果我正确理解模式,您想使用正则表达式

r"HD(?P<zeroes>0*)(?P<num>\d+)"

那时你可以做

results = re.search(...bla...).groupdict()

在这种情况下,它返回字典 {'zeroes': '', 'num':'479659'} 。从那里您可以根据需要进行填充。

现在是凌晨 5 点,否则我会为您提供更好的解决方案,但我希望这会有所帮助。

于 2012-10-13T10:11:58.870 回答