Подтвердить что ты не робот

Подстановочный шаблон Python в строке

Предположим, что у меня есть список

list = ['this','is','just','a','test']

Как я могу заставить пользователя выполнить поиск по шаблону?

Искать слово: 'th_s'

Вернул бы 'this'

4b9b3361

Ответ 1

Регулярные выражения, вероятно, являются самым простым решением этой проблемы:

import re
regex = re.compile('th.s')
l = ['this', 'is', 'just', 'a', 'test']
matches = [string for string in l if re.match(regex, string)]

Ответ 2

Используйте fnmatch:

import fnmatch
lst = ['this','is','just','a','test']
filtered = fnmatch.filter(lst, 'th?s')

Если вы хотите разрешить _ в качестве подстановочного знака, просто replace все подчеркивают с помощью '?' (для одного символа) или * (для нескольких символов).

Если вы хотите, чтобы ваши пользователи использовали еще более мощные параметры фильтрации, рассмотрите возможность использования регулярных выражений.

Ответ 3

Вы можете попробовать модуль fnmatch, он имеет подобный оболочке синтаксис подстановочного знака

или можете использовать регулярные выражения

импорт ре

Ответ 4

Вы имеете в виду какой-либо конкретный синтаксис для подстановочных знаков? Обычно * обозначает "один или несколько" символов, а ? обозначает один.

Простейший способ, вероятно, состоит в том, чтобы преобразовать выражение подстановки в регулярное выражение, а затем использовать его для фильтрации результатов.

Ответ 5

То же самое, что и Yuushi в использовании регулярных выражений, но в этом случае метод findall используется в библиотеке re, а не в понимании списка:

import re
regex = re.compile('th.s')
l = ['this', 'is', 'just', 'a', 'test']
matches = re.findall(regex, string)

Ответ 6

Почему бы вам просто не использовать функцию соединения? В регулярном выражении 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)

Ответ 7

Простым методом является os.system:

import os
text = 'this is text'
os.system("echo %s | grep 't*'" % text)