#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()
перед попыткой сопоставления. (Сохраните копию незаконченной строки.)