Hãy nói rằng tôi có một danh sách
list = ['this','is','just','a','test']
làm cách nào để yêu cầu người dùng thực hiện tìm kiếm theo ký tự đại diện?
Tìm kiếm từ: 'th_s'
Sẽ trả lại 'cái này'
Câu trả lời:
Biểu thức chính quy có lẽ là giải pháp dễ dàng nhất cho vấn đề này:
import re
regex = re.compile('th.s')
l = ['this', 'is', 'just', 'a', 'test']
matches = [string for string in l if re.match(regex, string)]
Sử dụng fnmatch:
import fnmatch
lst = ['this','is','just','a','test']
filtered = fnmatch.filter(lst, 'th?s')
Nếu bạn muốn cho phép _dưới dạng ký tự đại diện, chỉ cần thay thế tất cả các dấu gạch dưới bằng '?'(cho một ký tự) hoặc *(cho nhiều ký tự).
Nếu bạn muốn người dùng của mình sử dụng các tùy chọn lọc mạnh hơn nữa, hãy cân nhắc cho phép họ sử dụng các cụm từ thông dụng .
**ký tự đại diện không? (e-> Tôi đã kiểm tra các tài liệu- nó không xử lý các dấu gạch chéo khác nhau và vì vậy **ký tự đại diện thậm chí không cần thiết ở đây).
fnmatchlà "Đối sánh mẫu tên tệp Unix". Nhưng tôi vừa thử nó, và nó có vẻ hoạt động trên Windows. Đây là hành vi may mắn không xác định hay được fnmatchhỗ trợ trên Windows?
Bạn có thể thử mô-đun fnmatch , nó có cú pháp ký tự đại diện giống như shell
hoặc có thể sử dụng biểu thức chính quy
nhập lại
Bạn có nghĩa là bất kỳ cú pháp cụ thể cho các ký tự đại diện? Thường *là viết tắt của "một hoặc nhiều" ký tự và ?là viết tắt của một.
Cách đơn giản nhất có lẽ là dịch một biểu thức ký tự đại diện thành một biểu thức chính quy, sau đó sử dụng nó để lọc kết quả.
fnmatchmô-đun có chức năng dịch trận ký tự đại diện vào biểu thức thông thường:fnmatch.translate
Ý tưởng tương tự như Yuushi trong việc sử dụng biểu thức chính quy, nhưng điều này sử dụng phương pháp findall trong thư viện re thay vì đọc danh sách:
import re
regex = re.compile('th.s')
l = ['this', 'is', 'just', 'a', 'test']
matches = re.findall(regex, string)
Tại sao bạn không chỉ sử dụng chức năng tham gia? Trong một regex findall () hoặc group (), bạn sẽ cần một chuỗi để:
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
Hàm join () cho phép bạn biến đổi một danh sách trong một chuỗi. Dấu nháy đơn trước khi tham gia là những gì bạn sẽ đặt ở giữa mỗi chuỗi trong danh sách. Khi bạn thực thi phần mã này ('' .join (l)), bạn sẽ nhận được:
'Đây chỉ là một bài kiểm tra'
Vì vậy, bạn có thể sử dụng hàm findal ().
Tôi biết mình đã trễ 7 năm, nhưng gần đây tôi đã tạo một tài khoản vì tôi đang học và những người khác có thể có cùng câu hỏi. Tôi hy vọng điều này sẽ giúp bạn và những người khác.
Cập nhật các bình luận sau @ 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)
Phương pháp dễ dàng là thử os.system:
import os
text = 'this is text'
os.system("echo %s | grep 't*'" % text)