Python tìm mẫu trong danh sách

Xây dựng vấn đề. Cho một chuỗi dài hơn và một chuỗi ngắn hơn. Làm cách nào để tìm tất cả các lần xuất hiện của chuỗi ngắn hơn trong chuỗi dài hơn?

Xem xét ví dụ sau

  • Chuỗi dài hơn. 'Finxters learn Python with Finxter'
  • Mẫu chuỗi ngắn hơn.
    Finxter matched from position 0 to 7
    Finxter matched from position 27 to 34
    0
  • kết quả 1.
    Finxter matched from position 0 to 7
    Finxter matched from position 27 to 34
    1

Theo tùy chọn, bạn cũng có thể muốn nhận các vị trí mà chuỗi ngắn hơn phát sinh trong chuỗi dài hơn

  • kết quả 2.
    Finxter matched from position 0 to 7
    Finxter matched from position 27 to 34
    2

Phương pháp 1. Regex lại. công cụ tìm()

Để có được tất cả các lần xuất hiện của một mẫu trong một chuỗi nhất định, bạn có thể sử dụng phương thức biểu thức chính quy

Finxter matched from position 0 to 7
Finxter matched from position 27 to 34
3. Kết quả là một đối tượng khớp có thể lặp lại—bạn có thể truy xuất các chỉ số của khớp bằng cách sử dụng các hàm
Finxter matched from position 0 to 7
Finxter matched from position 27 to 34
4 và
Finxter matched from position 0 to 7
Finxter matched from position 27 to 34
5

import re
s = 'Finxters learn Python with Finxter'
pattern = 'Finxter'

# Method 1: re.finditer
for m in re.finditer(pattern, s):
    print(pattern, 'matched from position', m.start(), 'to', m.end())

đầu ra là

Finxter matched from position 0 to 7
Finxter matched from position 27 to 34

🌍 Hướng dẫn liên quan. Trình tìm kiếm Regex Python

Phương pháp 2. lại. finditer() + Danh sách hiểu

Để lấy chuỗi mẫu, chỉ mục bắt đầu và chỉ mục kết thúc của trận đấu vào danh sách các bộ dữ liệu, bạn có thể sử dụng một lớp lót sau dựa trên mức độ hiểu danh sách

Finxter matched from position 0 to 7
Finxter matched from position 27 to 34
6

import re
s = 'Finxters learn Python with Finxter'
pattern = 'Finxter'

# Method 2: re.finditer + list comprehension
l = [(pattern, m.start(), m.end()) for m in re.finditer(pattern, s)]
print(l)

đầu ra là

[('Finxter', 0, 7), ('Finxter', 27, 34)]

🌍 Hướng dẫn liên quan. Hiểu danh sách Python

Giới thiệu đơn giản về hiểu danh sách trong Python

Python tìm mẫu trong danh sách

Xem video này trên YouTube

Phương pháp 3. Chuỗi Python bắt đầu bằng ()

Phương thức

Finxter matched from position 0 to 7
Finxter matched from position 27 to 34
7 của Python kiểm tra xem một chuỗi đã cho có bắt đầu bằng tiền tố hay không khi bắt đầu tìm kiếm
Finxter matched from position 0 to 7
Finxter matched from position 27 to 34
8 tại chỉ mục
Finxter matched from position 0 to 7
Finxter matched from position 27 to 34
9

Chúng ta có thể sử dụng phương thức

import re
s = 'Finxters learn Python with Finxter'
pattern = 'Finxter'

# Method 2: re.finditer + list comprehension
l = [(pattern, m.start(), m.end()) for m in re.finditer(pattern, s)]
print(l)
0 trong câu lệnh hiểu danh sách để tìm tất cả các lần xuất hiện (vị trí) của một chuỗi con trong một chuỗi đã cho như vậy

import re
s = 'Finxters learn Python with Finxter'
pattern = 'Finxter'

# Method 2: re.finditer + list comprehension
l = [(pattern, m.start(), m.end()) for m in re.finditer(pattern, s)]
print(l)
1

Đây là ví dụ đầy đủ sử dụng phương pháp này

s = 'Finxters learn Python with Finxter'
pattern = 'Finxter'

# Method 4: startswith() to find all occurrences of substring in string
l = [i for i in range(len(s)) if s.startswith(pattern, i)]

print(l)

Đầu ra hiển thị một danh sách các chỉ số bắt đầu nơi chuỗi con (mẫu) được tìm thấy trong chuỗi gốc

[0, 27]

Bạn phải trả tiền để tìm hiểu những kiến ​​thức cơ bản về Python—hãy thoải mái tìm hiểu sâu hơn về phương pháp này trong hướng dẫn blog Finxter sau đây chỉ bằng một cú nhấp chuột

🌍 Hướng dẫn liên quan. Chuỗi Python Bắt đầu với

Phương pháp 4. lại. tìm tất cả ()

Nếu bạn chỉ quan tâm đến các chuỗi con phù hợp mà không có vị trí chỉ mục của chúng trong chuỗi đã cho, bạn có thể sử dụng phương pháp sau

Để tìm tất cả các chuỗi con trong một chuỗi đã cho, hãy sử dụng hàm

import re
s = 'Finxters learn Python with Finxter'
pattern = 'Finxter'

# Method 2: re.finditer + list comprehension
l = [(pattern, m.start(), m.end()) for m in re.finditer(pattern, s)]
print(l)
2 trả về danh sách các chuỗi con phù hợp—mỗi chuỗi con phù hợp

import re
s = 'Finxters learn Python with Finxter'
pattern = 'Finxter'

# Method 4: re.findall() to find all patterns in string
l = re.findall(pattern, s)
print(l)
# ['Finxter', 'Finxter']

Trong trường hợp bạn thắc mắc phương pháp

import re
s = 'Finxters learn Python with Finxter'
pattern = 'Finxter'

# Method 2: re.finditer + list comprehension
l = [(pattern, m.start(), m.end()) for m in re.finditer(pattern, s)]
print(l)
3 hoạt động như thế nào, hãy xem biểu đồ này

Python tìm mẫu trong danh sách

🌍 Hướng dẫn liên quan. Python Regex Findall

Python Regex Findall()

Python tìm mẫu trong danh sách

Xem video này trên YouTube

Phương pháp 5. Không Regex, đệ quy, chồng chéo

Phương pháp sau đây dựa trên đệ quy và nó không yêu cầu bất kỳ thư viện bên ngoài nào

Ý tưởng là liên tục tìm sự xuất hiện tiếp theo của mẫu chuỗi con trong chuỗi và gọi cùng một phương thức theo cách đệ quy trên một chuỗi ngắn hơn—di chuyển vị trí bắt đầu sang bên phải cho đến khi không tìm thấy kết quả khớp nào nữa

Tất cả các chuỗi con phù hợp được tìm thấy được tích lũy trong một biến

import re
s = 'Finxters learn Python with Finxter'
pattern = 'Finxter'

# Method 2: re.finditer + list comprehension
l = [(pattern, m.start(), m.end()) for m in re.finditer(pattern, s)]
print(l)
4 khi bạn thực hiện các cuộc gọi đệ quy

s = 'Finxters learn Python with Finxter'
pattern = 'Finxter'

# Method 5: recursive, without regex
def find_all(pattern, # string pattern
             string, # string to be searched
             start=0, # ignore everything before start
             acc=[]): # All occurrences of string pattern in string

    # Find next occurrence of pattern in string
    i = string.find(pattern, start)
    
    if i == -1:
        # Pattern not found in remaining string
        return acc
    
    return find_all(pattern, string, start = i+1,
                    acc = acc + [(pattern, i)]) # Pass new list with found pattern

l = find_all(pattern, s)
print(l)

đầu ra là

[('Finxter', 0), ('Finxter', 27)]

Lưu ý rằng phương pháp này cũng tìm thấy các kết quả khớp chồng chéo—ngược lại với các phương thức regex sử dụng tất cả các chuỗi con được khớp một phần

Đi đâu từ đây?

Đủ lý thuyết. Hãy thực hành một số

Các lập trình viên được trả sáu con số trở lên vì họ có thể giải quyết vấn đề hiệu quả hơn bằng cách sử dụng trí thông minh máy móc và tự động hóa

Để trở nên thành công hơn trong việc viết mã, hãy giải quyết nhiều vấn đề thực tế hơn cho người thực. Đó là cách bạn trau dồi những kỹ năng bạn thực sự cần trong thực tế. Rốt cuộc, việc sử dụng lý thuyết học tập mà không ai cần là gì?

Bạn xây dựng các kỹ năng mã hóa có giá trị cao bằng cách làm việc trên các dự án mã hóa thực tế

Bạn có muốn ngừng học với các dự án đồ chơi và tập trung vào các dự án mã thực tế giúp bạn kiếm tiền và giải quyết các vấn đề thực sự cho mọi người không?

🚀 Nếu câu trả lời của bạn là CÓ. , cân nhắc trở thành nhà phát triển Python tự do. Đó là cách tốt nhất để tiếp cận nhiệm vụ cải thiện kỹ năng Python của bạn—ngay cả khi bạn là người mới hoàn toàn

Nếu bạn chỉ muốn tìm hiểu về cơ hội làm việc tự do, vui lòng xem hội thảo trên web miễn phí của tôi “Cách xây dựng kỹ năng Python có thu nhập cao của bạn” và tìm hiểu cách tôi phát triển công việc viết mã của mình trực tuyến cũng như cách bạn có thể làm được—từ sự thoải mái của bạn

Tham gia hội thảo trên web miễn phí ngay bây giờ

Tài nguyên. https. // stackoverflow. com/câu hỏi/3873361/finding-multiple-occurrences-of-a-string-within-a-string-in-python

Python tìm mẫu trong danh sách

Chris

Trong khi làm việc với tư cách là một nhà nghiên cứu trong các hệ thống phân tán, Dr. Christian Mayer tìm thấy tình yêu của mình với việc dạy sinh viên khoa học máy tính

Để giúp sinh viên đạt được mức độ thành công Python cao hơn, anh ấy đã thành lập trang web giáo dục lập trình Finxter. com. Ông là tác giả của cuốn sách lập trình nổi tiếng Python One-Liners (NoStarch 2020), đồng tác giả của loạt sách tự xuất bản Coffee Break Python, người đam mê khoa học máy tính, cộng tác viên tự do và chủ sở hữu của một trong 10 blog Python lớn nhất thế giới

Niềm đam mê của anh ấy là viết, đọc và mã hóa. Nhưng niềm đam mê lớn nhất của anh ấy là phục vụ các lập trình viên đầy tham vọng thông qua Finxter và giúp họ nâng cao kỹ năng của mình. Bạn có thể tham gia học viện email miễn phí của anh ấy tại đây