2017-09-23 18 views
1
私はすでにこのテーマに関するいくつかの質問があったけど、どれも私は私の問題を解決しない

...私はときにCSV形式の文書に名前を交換する必要がのPython:sre_constants.errorのエラー:比類のないグループ

{SPEAKER}または{SPEAKERS}のタグに従ってください。

File "/usr/lib/python2.7/re.py", line 291, in filter 
    return sre_parse.expand_template(template, match) 
    File "/usr/lib/python2.7/sre_parse.py", line 831, in expand_template 
    raise error, "unmatched group" 
sre_constants.error: unmatched group 

私のスクリプトの一部は次のとおりです:しかし、私は、次のエラーメッセージが表示さ

list_speakers = re.compile(r'^\{GROUP OF SPEAKERS\}\t(.*)|^\{SPEAKER\}\t(.*)') 

usernames = set() 
for f in corpus: 
    with open(f, "r", encoding=encoding) as fin: 
     line = fin.readline() 
     while line: 
      line = line.rstrip() 
      if not line: 
       line = fin.readline() 
       continue 

      if not list_speakers.match(line): 
       line = fin.readline() 
       continue 

      names = list_speakers.sub(r'\1', line) 
      names = names.split(", ") 
      for name in names: 
       usernames.add(name) 

      line = fin.readline() 
+0

試してみてください。\\({スピーカーグループ|スピーカー)\} \ t(。*) '' –

+0

素晴らしい作品です!どうもありがとうございました !! – Lili

+0

私は答えを投稿しました、upvoting/acceptingを検討してください。 –

答えて

1

issue is a known one:グループが初期化されていなかった場合、後方参照は、空の文字列内に設定されていませんPythonのバージョンは3.5までです。

カスタム置換ロジックを実装するための代替引数として、ラムダ式が1つだけあることを確認するか、ラムダ式を使用する必要があります。ここで

、あなたは簡単に単一のキャプチャグループとのパターンに正規表現をrevamptことができます。

r'^\{(?:GROUP OF SPEAKERS|SPEAKER)\}\t(.*)' 

regex demo

詳細

  • ^を参照してください - 文字列の先頭を
  • \{から{
  • (?:GROUP OF SPEAKERS|SPEAKER)から}(あなたも、それはエスケープする必要はありません、}を書くこと)
  • \t - - タブ文字
  • GROUP OF SPEAKERSまたはSPEAKER
  • \}のいずれかに合致する非キャプチャグループ(.*) - グループ1:できるだけ多くの行ブレーク文字以外の0以上の任意の文字(行の残りの部分)。
+0

しかし、今私は "names = list_speakers.sub(r '\ 1'、line)"という行に問題があります。なぜこの問題が発生したのか分かりますか? – Lili

+0

@Liliその行の問題は何ですか?何が起こりますか? –

+0

私はそれを解決しました。愚かな間違いです。正規表現を少し修正しなければならなかったので、グループの数に注意を払わなかったので、空のグループがあり、うまくいかなかった...とにかくありがとう! – Lili

関連する問題