Поиск без учета регистра регулярных выражений, не соответствующий точному слову

#python #regex

#python #регулярное выражение

Вопрос:

Я использую следующее регулярное выражение для одновременного поиска в 3 разных строковых форматах. Кроме того, я использую re.IGNORECASE для сопоставления строк верхнего и нижнего регистра. Однако, когда я выполняю поиск (например, ‘locality’), я могу получить совпадения строк для ‘localit’, ‘locali’, ‘local’ и так далее, и тому подобное. Я хочу подобрать точное слово (например, ‘locality’).

Кроме того, если между строковыми символами есть пробел (например, 'l ocal i ty' ), я хочу это проигнорировать. Я не нашел re метода, который позволяет мне это сделать. Я попытался использовать re.ASCII , но получаю сообщение об ошибке: «… неверный ascii!» Приветствуется любая помощь.

 elif searchType =='2':
  print "  Directory to be searched: c:Python27 "
  directory = os.path.join("c:\","Python27")
  userstring = raw_input("Enter a string name to search: ")
  userStrHEX = userstring.encode('hex')
  userStrASCII = ' '.join(str(ord(char)) for char in userstring)
  regex = re.compile(r"(%s|%s|%s)" % ( re.escape( userstring ), re.escape( userStrHEX ), re.escape( userStrASCII ))re.IGNORECASE)
  for root,dirname, files in os.walk(directory):
     for file in files:
         if file.endswith(".log") or file.endswith(".txt"):
            f=open(os.path.join(root, file))
            for line in f.readlines():
               #if userstring in line:
               if regex.search(line):       
                  print "file: "   os.path.join(root,file)           
                  break
            else:
               #print "String NOT Found!"
               break
            f.close()
  

Комментарии:

1. Пожалуйста, покажите нам несколько конкретных примеров трех пользовательских строк и строки, в которой вы ищете. Также, пожалуйста, скажите, что вы получаете и что вы хотели бы получить.

2. Если вы хотите игнорировать пробелы между символами, то вам, вероятно, нужно вставить s* между каждым символом в исходных строках, которые вы ищете.

3. Пожалуйста, исправьте форматирование вашего исходного кода — четыре пробела перед каждой строкой и соответствующий отступ.

4. @tchrist: чувствителен к пробелам и имеет сильную аллергию на боковые усы { … : P

5. Разве перед re.IGNORECASE не должна быть запятая?

Ответ №1:

В re такого флага нет, поэтому либо:

  • создайте регулярное выражение с явным сопоставлением пробелов после каждого символа:

    r's*'.join(c for c in userStrASCII)

    Это работает: myre.findall(line) находит ‘l Oc ALi ty’

  • или (если вам нужно только обнаружить совпадения с шаблоном, но ничего не делать с фактическим текстом соответствия) используйте string.translate(,deleteChars) для удаления пробелов из строки перед сопоставлением. например, сделайте line.translate(None, ' tnr').lower() перед попыткой сопоставления. (Сохраните копию незаконченной строки.)