Предположим, что у меня есть список
list = ['this','is','just','a','test']
Как я могу заставить пользователя выполнить поиск по шаблону?
Искать слово: 'th_s'
Вернул бы 'this'
Предположим, что у меня есть список
list = ['this','is','just','a','test']
Как я могу заставить пользователя выполнить поиск по шаблону?
Искать слово: 'th_s'
Вернул бы 'this'
Регулярные выражения, вероятно, являются самым простым решением этой проблемы:
import re
regex = re.compile('th.s')
l = ['this', 'is', 'just', 'a', 'test']
matches = [string for string in l if re.match(regex, string)]
Используйте fnmatch
:
import fnmatch
lst = ['this','is','just','a','test']
filtered = fnmatch.filter(lst, 'th?s')
Если вы хотите разрешить _
в качестве подстановочного знака, просто replace все подчеркивают с помощью '?'
(для одного символа) или *
(для нескольких символов).
Если вы хотите, чтобы ваши пользователи использовали еще более мощные параметры фильтрации, рассмотрите возможность использования регулярных выражений.
Вы можете попробовать модуль fnmatch, он имеет подобный оболочке синтаксис подстановочного знака
или можете использовать регулярные выражения
импорт ре
Вы имеете в виду какой-либо конкретный синтаксис для подстановочных знаков? Обычно *
обозначает "один или несколько" символов, а ?
обозначает один.
Простейший способ, вероятно, состоит в том, чтобы преобразовать выражение подстановки в регулярное выражение, а затем использовать его для фильтрации результатов.
То же самое, что и Yuushi в использовании регулярных выражений, но в этом случае метод findall используется в библиотеке re, а не в понимании списка:
import re
regex = re.compile('th.s')
l = ['this', 'is', 'just', 'a', 'test']
matches = re.findall(regex, string)
Почему бы вам просто не использовать функцию соединения? В регулярном выражении findall() или group() вам понадобится строка так:
import re
regex = re.compile('th.s')
l = ['this', 'is', 'just', 'a', 'test']
matches = re.findall(regex, ' '.join(l)) #Syntax option 1
matches = regex.findall(' '.join(l)) #Syntax option 2
Функция join() позволяет вам преобразовывать список в строку. Одиночная кавычка перед объединением - это то, что вы поместите в середину каждой строки в списке. Когда вы выполните эту часть кода (''.join(l)), вы получите следующее:
"Это всего лишь тест"
Таким образом, вы можете использовать функцию findal().
Я знаю, что опоздал на 7 лет, но недавно я создал учетную запись, потому что я учусь, и у других людей может возникнуть тот же вопрос. Я надеюсь, что это поможет вам и другим.
Обновление После комментариев @FélixBrunet:
import re
regex = re.compile(r'th.s')
l = ['this', 'is', 'just', 'a', 'test','th','s', 'this is']
matches2=[] #declare a list
for i in range(len(l)): #loop with the iterations = list l lenght. This avoid the first item commented by @Felix
if regex.findall(l[i]) != []: #if the position i is not an empty list do the next line. PS: remember regex.findall() command return a list.
if l[i]== ''.join(regex.findall(l[i])): # If the string of i position of l list = command findall() i position so it'll allow the program do the next line - this avoid the second item commented by @Félix
matches2.append(''.join(regex.findall(l[i]))) #adds in the list just the string in the matches2 list
print(matches2)
Простым методом является os.system
:
import os
text = 'this is text'
os.system("echo %s | grep 't*'" % text)