docs: def _prepRESearchStr(matchStr, wordInitial='ok', wordFinal='ok',
                       spanSyllable='ok', stressedSyllable='ok'):
      '''
      Prepares a user's RE string for a search
      '''
      
      # Protect sounds that are two characters
      # After this we can assume that each character represents a sound
      # (We'll revert back when we're done processing the RE)
      replList = [(u'ei', u'9'), (u'tʃ', u'='), (u'oʊ', u'~'),
                  (u'dʒ', u'@'), (u'aʊ', u'%'), (u'ɑɪ', u'&'),
                  (u'ɔi', u'$')]
  
      # Add to the replList
      currentReplNum = 0
      startI = 0
      for left, right in (('(', ')'), ('[', ']')):
          while True:
              try:
                  i = matchStr.index(left, startI)
              except ValueError:
                  break
              j = matchStr.index(right, i) + 1
              replList.append((matchStr[i:j], str(currentReplNum)))
              currentReplNum += 1
              startI = j
      
      for charA, charB in replList:
          matchStr = matchStr.replace(charA, charB)
      
      # Characters to check between all other characters
      # Don't check between all other characters if the character is already
      # in the search string or
      interleaveStr = None
      stressOpt = (stressedSyllable == 'ok' or stressedSyllable == 'only')
      spanOpt = (spanSyllable == 'ok' or spanSyllable == 'only')
      if stressOpt and spanOpt:
          interleaveStr = u"\.?ˈ?"
      elif stressOpt:
          interleaveStr = u"ˈ?"
      elif spanOpt:
          interleaveStr = u"\.?"
      
      if interleaveStr is not None:
          matchStr = interleaveStr.join(matchStr)
      
      # Setting search boundaries
      # We search on '[^\.#]' and not '.' so that the search doesn't span
      # multiple syllables or words
      if wordInitial == 'only':
          matchStr = u'#' + matchStr
      elif wordInitial == 'no':
          # Match the closest preceeding syllable.  If there is none, look
          # for word boundary plus at least one other character
          matchStr = u'(?:\.[^\.#]*?|#[^\.#]+?)' + matchStr
      else:
          matchStr = u'[#\.][^\.#]*?' + matchStr
      
      if wordFinal == 'only':
          matchStr = matchStr + u'#'
      elif wordFinal == 'no':
          matchStr = matchStr + u"(?:[^\.#]*?\.|[^\.#]+?#)"
      else:
          matchStr = matchStr + u'[^\.#]*?[#\.]'
      
      # For sounds that are designated two characters, prevent
      # detecting those sounds if the user wanted a sound
      # designated by one of the contained characters
      
      # Forward search ('a' and not 'ab')
      insertList = []
      for charA, charB in [(u'e', u'i'), (u't', u'ʃ'), (u'd', u'ʒ'),
                           (u'o', u'ʊ'), (u'a', u'ʊ|ɪ'), (u'ɔ', u'i'), ]:
          startI = 0
          while True:
              try:
                  i = matchStr.index(charA, startI)
              except ValueError:
                  break
              if matchStr[i + 1] != charB:
                  forwardStr = u'(?!%s)' % charB
  #                 matchStr = matchStr[:i + 1] + forwardStr + matchStr[i + 1:]
                  startI = i + 1 + len(forwardStr)
                  insertList.append((i + 1, forwardStr))
          
      # Backward search ('b' and not 'ab')
      for charA, charB in [(u't', u'ʃ'), (u'd', u'ʒ'),
                           (u'a|o', u'ʊ'), (u'e|ɔ', u'i'), (u'ɑ' u'ɪ'), ]:
          startI = 0
          while True:
              try:
                  i = matchStr.index(charB, startI)
              except ValueError:
                  break
              if matchStr[i - 1] != charA:
                  backStr = u'(?<!%s)' % charA
  #                 matchStr = matchStr[:i] + backStr + matchStr[i:]
                  startI = i + 1 + len(backStr)
                  insertList.append((i, backStr))
                  
      insertList.sort()
      for i, insertStr in insertList[::-1]:
          matchStr = matchStr[:i] + insertStr + matchStr[i:]
      
      # Revert the special sounds back from 1 character to 2 characters
      for charA, charB in replList:
          matchStr = matchStr.replace(charB, charA)
  
      # Replace special characters
      replDict = {"D": u"(?:t(?!ʃ)|d(?!ʒ)|[sz])",  # dentals
                  "F": u"[ʃʒfvszɵðh]",  # fricatives
                  "S": u"(?:t(?!ʃ)|d(?!ʒ)|[pbkg])",  # stops
                  "N": u"[nmŋ]",  # nasals
                  "R": u"[rɝɚ]",  # rhotics
                  "V": u"(?:aʊ|ei|oʊ|ɑɪ|ɔi|[iuæɑɔəɛɪʊʌ]):?",  # vowels
                  "B": u"\.",  # syllable boundary
                  }
  
      for char, replStr in replDict.items():
          matchStr = matchStr.replace(char, replStr)
  
      return matchStr