1

次の形式のデータを含む.txtファイルがあります。

pq1000007 35 2 237493054 0.013328573 

最初、3番目、最後の数値をキャプチャする正規表現を使用しようとしていますが、最後の数値が.4より大きい場合に限ります。何らかの理由で、「NoneTypeオブジェクトには属性'group'がありません」というメッセージが表示されます。何か案は?

コード:

InFileName = "PerkQP_CHGV_SCZ.txt"
InFile = open(InFileName, 'r')

OutFileName='PAZ_OUT' + ".txt"
OutFile=open(OutFileName, 'w')


for Line in InFile:
    match = re.search('(\w+)\s\d+\s(\d+)\s\d+\d+\s(\d+\.\d+)', Line)
    if match.group(2) > 0.4:
        c = match.group()
        print(c)
        OutFile.write(c+"\n")

InFile.close()
OutFile.close()
4

2 に答える 2

1

検索結果がNoneの場合は、正規表現が一致していないことを意味します。あなたが与えた例ではうまくいくようですが、おそらくファイル内の実際のデータはパターンと一致していません。\d+\d+(また、正規表現には、あるべきものが含まれていることがわかります\d+。)

さらに、は文字列match.groupを返します。それを数値に変換する必要があります(たとえば、数値0.4と比較するため)。float(match.group(2))

于 2012-09-23T22:04:59.630 に答える
1

いくつかの問題:

正規表現の一致は文字列であるため、floatと有意義に比較することはできません(実際、Python 3では、これを行うことは違法です)。Python 2では、どの文字列も常にfloatよりも大きく比較されます("str"ASCIIでは。よりも大きいためです"float"。はい、このルールは意味がありません。Python3がそれを廃止したのは良いことです)。

次に、その正規表現の最後の番号は3番目の キャプチャグループにあるため、次のことを行う必要があります。

if float(match.group(3)) > 0.4:

r"..."次に、正規表現で逐語的な文字列()を使用する必要があります。

最後に、\d+\d+もちろん冗長です\d+が、行います。

match = re.search(r'(\w+)\s\d+\s(\d+)\s\d+\s(\d+\.\d+)', Line)

この正規表現は、指定した例の行と一致するため、エラーメッセージ(一致しないことを示す)の発信元が異なる必要があります。おそらく、ファイルのどこかに正規表現と一致しない行があります。その場合、次のようにプログラムを構成できます。

for Line in InFile:
    match = re.search(r'(\w+)\s\d+\s(\d+)\s\d+\s(\d+\.\d+)', Line)
    if match:
        if float(match.group(3)) > 0.4:
            # do stuff
        else:
            print "No match: ", Line
于 2012-09-23T22:06:21.240 に答える