2016-12-19 2 views
2

私は、ファイルの行の文字列にマッチし、マッチを作成しようとマイナス最初のものと最後の1つの文字列を返すre.searchを取得するには?

import os, re 

infile=open("~/infile", "r") 
out=open("~/out", "w") 
pattern=re.compile("=[A-Z0-9]*>") 
for line in infile: 
    out.write(pattern.search(line)[1:-1] + '\n') 

問題は、私が追加しようとしたとき、それは、Matchが添字化ではないと言うことですよ.group()はそれがNonegroup has no attritube groupgroups()戻っ.writeことがタプルなど

任意のアイデアどのように文字列を返すように.searchを取得するために必要であると述べていますか?

+2

あなたは 're.findall'を使用しない理由は、文字列をしたい場合は? –

+2

'' NoneType 'オブジェクトに' group 'という属性がないと、検索が失敗したことを意味します。 – TigerhawkT3

+0

@PhilipTzou答えとして投稿する必要があります。 –

答えて

1

=>の間に文字列の一部だけが必要なようです。このような場合には、英数字パターンの周りキャプチャグループを使用し、見つかった場合Noneを返さないが、ちょうどマッチしない時に空のリスト、または取り込んだテキストのリスト決してre.findallでそれを使用する方がはるかに簡単です。また、私はあなたが空の一致を必要と疑うので、*の代わりに+を使用します。

pattern=re.compile(r"=([A-Z0-9]+)>") 
        ^  ^

、その後

"\n".join(pattern.findall(line)) 
0

re.search関数は、Matchオブジェクトを返します。

一致が失敗すると、re.search関数はNoneを返します。一致するテキストを抽出するには、Match.groupメソッドを使用します。

>>> match = re.search("a.", "abc") 
>>> if match is not None: 
...  print(match.group(0)) 
'ab' 
>>> print(re.search("a.", "a")) 
None 

は、それが試合の必要な部分を見つけるために、グループを使用することはおそらく良いアイデアだし、言った:@WiktorStribiżewが示唆するように

>>> match = re.search("=([A-Z0-9]*)>", "=abc>") # Notice brackets 
>>> match.group(0) 
'=abc>' 
>>> match.group(1) 
'abc' 

、この正規表現は、その後のfindAllで使用することができます。

+0

OPはすでにそれをやっており、一致しなかったのでエラーが発生しています。 – TigerhawkT3

+0

私は編集しているのを見ました。 – pradyunsg

+0

また、彼が得ていると思われるエラーは必ずしも必要ではありません。 – pradyunsg

関連する問題