code: def extract_choice(self, gen, prompt, choice_list):
      res = re.search(
          r"(?:(?:选|选择|选定)[：:]?\s*|(?:(?:答案|选项)(?![^ABCD]{0,10}?(?:不|非)[^ABCD]{0,10}?(?:是|选|为|：|:|】))[^ABCD]{0,10}?(?:是|选|为|：|:|】))[^ABCD]{0,10}?)(A|B|C|D)(?:选项)?(?:\)|。|\.|，|,|．|、|A|B|C|D|$|：|:|\)|）)",
          gen,
      )
  
      if res is None:
          res = re.search(
              r"(A|B|C|D)(?:选?项)?(?![^ABCD]{0,4}?(?:不|非)[^ABCD]{0,4}?(?:正确|对[的，。：]|符合))[^ABCD]{0,4}?(?:正确|对[的，。：]|符合)",
              gen,
          )
  
      if res is None:
          res = re.search(
              r"^[\(（]?(A|B|C|D)(?:。|\)|）|\.|，|,|．|：|:|$)", gen
          )
  
      if res is None:
          res = re.search(r"(?<![a-zA-Z])(A|B|C|D)(?![a-zA-Z=])", gen)
  
      if res is None:
          return self.choices[
              choice_list.index(process.extractOne(gen, choice_list)[0])
          ]
      return res.group(1)
  
file_path: BigDL/python/llm/dev/benchmark/ceval/evaluators/qwen.py
imports: import re
  from tqdm import tqdm
  import torch
  from thefuzz import process
  from transformers import AutoTokenizer
  from transformers.generation import GenerationConfig
  from bigdl.llm.transformers import AutoModelForCausalLM
  from evaluators.evaluator import Evaluator
label_desc: Use image node_id 4 for calling the QwenEvaluator obj's underlying member method code with example usage: obj.extract_choice(gen, prompt, choice_list) and returns: res, self