0

正規表現を使用してリスト内の可変長項目を置き換えようとしています。たとえば、この項目「HD479659」は「HD0000000479659」に置き換えてください。次のプログラムを作成しましたが、実行するたびに次のエラーが発生しました:「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()

この場合、dict {'zeroes': '', 'num':'479659'} を返します。そこから、必要に応じてパディングできます。

現時点で午前 5 時です。または、より適切な解決策をご用意したいと思いますが、これがお役に立てば幸いです。

于 2012-10-13T10:11:58.870 に答える