Hướng dẫn python regex match filename - tên tệp trùng khớp python regex

Tôi có một tệp văn bản được xóa khỏi email của tôi có chứa 1 tệp đính kèm/thư. Tệp đính kèm có mặt dưới các tên khác nhau với các định dạng khác nhau, ví dụ:

filename="John_wheeler 11041997 resume.pdf";
filename="Kujal_newResume[1].pdf"; 
filename=JohnKrasinski_Resume.pdf

Câu hỏi của tôi là: Có cách nào để tìm một mẫu regex sẽ bắt đầu tìm kiếm từ

. ^ $ * + ? { } [ ] \ | [ ]
9 và đi cho đến khi ký tự DOT [tách biệt với phần mở rộng tệp] không? Nhận tiện ích mở rộng tệp sẽ là nhiệm vụ tiếp theo, nhưng tôi có thể giữ điều đó ngay bây giờ.

Nimantha

6.6946 Huy hiệu vàng25 Huy hiệu bạc65 Huy hiệu Đồng6 gold badges25 silver badges65 bronze badges

Đã hỏi ngày 8 tháng 3 năm 2019 lúc 7:07Mar 8, 2019 at 7:07

1

Bạn có thể thử mẫu này:

>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
0

Nó giả định rằng DOT phân tách tên tệp với phần mở rộng.

Explanation:

>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
1 - khớp
. ^ $ * + ? { } [ ] \ | [ ]
9 theo nghĩa đen và Tehn khớp 0 hoặc 1 dấu nháy đơn
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
3

>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
4 - Kết hợp một hoặc nhiều ký tự không phải là dấu chấm [khớp với mọi thứ cho đến khi chấm] và lưu trữ nó trong nhóm chụpnot a dot [match everything until dot] and store it in capturing group

Tên tệp mong muốn của bạn sẽ được lưu trữ trong nhóm chụp.

Thử nghiệm

Thêm: Để ghi lại phần mở rộng tệp, bạn có thể sử dụng mẫu như vậy:

>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
5: to capture also file extension, you could use such pattern:
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
5

Điều bổ sung ở đây là

>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
6: Kết hợp DOT theo nghĩa đen với
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
7. Sau đó, nó khớp với một hoặc nhiều ký tự khác ngoài
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
3 hoặc
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
9 với mẫu
>>> p = re.compile['ab*', re.IGNORECASE]
0 và lưu trữ nó trong lần chụp thứ hai.

Một bản demo khác

Đã trả lời ngày 8 tháng 3 năm 2019 lúc 8:12Mar 8, 2019 at 8:12

Michał Turczynmichał TurczynMichał Turczyn

31.4K14 Huy hiệu vàng42 Huy hiệu bạc67 Huy hiệu đồng14 gold badges42 silver badges67 bronze badges

Làm thế nào về những điều sau:

[?:filename=][[^\.]*]\.[\w*]

Regex này trả về các nhóm khác nhau chứa các yếu tố khác nhau mà bạn quan tâm.

Đã trả lời ngày 8 tháng 3 năm 2019 lúc 7:15Mar 8, 2019 at 7:15

tk78tk78tk78

8577 Huy hiệu bạc14 Huy hiệu Đồng7 silver badges14 bronze badges

Tôi không chắc đầu ra bạn mong đợi. Nhưng điều này có thể giúp. Regexdemo

[?> p.match[""]
>>> print[p.match[""]]
None
1, hãy sử dụng
[?> import re
>>> p = re.compile['[a-z]+']
>>> p
re.compile['[a-z]+']
6 mà không làm cho các biểu thức thường xuyên của Perl khác nhau một cách khó hiểu so với Res Standard. Ví dụ, nếu họ chọn
[?>> p = re.compile['ab*', re.IGNORECASE]
1 là một sai lầm. Nếu bạn phù hợp với một chuỗi cố định hoặc một lớp ký tự duy nhất và bạn sẽ không sử dụng bất kỳ tính năng
>>> p = re.compile['ab*', re.IGNORECASE]
1 nào như cờ
[?>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
01, nhưng
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
02 có khả năng thực hiện cả hai nhiệm vụ và sẽ nhanh hơn bất kỳ hoạt động biểu thức chính quy nào có thể.

Nói tóm lại, trước khi chuyển sang mô -đun

>>> p = re.compile['ab*', re.IGNORECASE]
1, hãy xem xét liệu vấn đề của bạn có thể được giải quyết bằng phương pháp chuỗi nhanh hơn và đơn giản hơn hay không.

khớp [] so với tìm kiếm [] ¶

Hàm

[?> p = re.compile['ab*']
>>> p
re.compile['ab*']
09 và chỉ cần thêm
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
10 vào mặt trước của RE. Thay vào đó, hãy chống lại sự cám dỗ này và sử dụng
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
11. Trình biên dịch biểu thức chính quy thực hiện một số phân tích RES để tăng tốc quá trình tìm kiếm một trận đấu. Một phân tích như vậy đưa ra những gì nhân vật đầu tiên của một trận đấu phải là gì; Ví dụ: một mẫu bắt đầu bằng
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
12 phải khớp với bắt đầu với
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
13. Phân tích cho phép động cơ nhanh chóng quét qua chuỗi tìm kiếm ký tự bắt đầu, chỉ thử toàn bộ trận đấu nếu tìm thấy
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
13.

Thêm

>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
10 đánh bại tối ưu hóa này, yêu cầu quét vào cuối chuỗi và sau đó quay lại để tìm một trận đấu cho phần còn lại của RE. Sử dụng
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
11 thay thế.

Tham lam so với không tham lam

Khi lặp lại một biểu thức chính quy, như trong

>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
17, hành động kết quả là tiêu thụ càng nhiều mô hình càng tốt. Thực tế này thường cắn bạn khi bạn đang cố gắng phù hợp với một cặp phân tích cân bằng, chẳng hạn như giá đỡ góc xung quanh thẻ HTML. Mẫu ngây thơ để phù hợp với một thẻ HTML duy nhất không hoạt động vì tính chất tham lam của
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
10.

. ^ $ * + ? { } [ ] \ | [ ]
5

RE khớp với

>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
19 trong
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
20 và
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
10 tiêu thụ phần còn lại của chuỗi. Mặc dù vậy, vẫn còn nhiều hơn nữa trong RE, và
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
22 có thể phù hợp ở cuối chuỗi, do đó, công cụ biểu thức thông thường phải quay lại ký tự cho đến khi nó tìm thấy một trận đấu cho
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
22. Trận đấu cuối cùng kéo dài từ
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
19 trong
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
20 đến
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
26 trong
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
27, đó là những gì bạn muốn.

Trong trường hợp này, giải pháp là sử dụng các bộ định lượng không màu xanh lá cây

>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
28,
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
29,
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
30 hoặc
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
31, phù hợp với văn bản ít nhất có thể. Trong ví dụ trên,
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
26 được thử ngay sau khi
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
19 đầu tiên kết hợp và khi nó bị hỏng, động cơ sẽ tiến một nhân vật tại một thời điểm, thử lại
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
26 ở mỗi bước. Điều này chỉ tạo ra kết quả đúng:

. ^ $ * + ? { } [ ] \ | [ ]
6

. Xử lý tất cả các trường hợp có thể, các mẫu sẽ rất phức tạp. Sử dụng mô -đun phân tích cú pháp HTML hoặc XML cho các tác vụ đó.]

Sử dụng Re.verbose¶

Đến bây giờ, bạn có thể nhận thấy rằng các biểu thức thông thường là một ký hiệu rất nhỏ gọn, nhưng chúng không thể đọc được khủng khiếp. Res của sự phức tạp vừa phải có thể trở thành các bộ sưu tập dài các dấu gạch chéo ngược, dấu ngoặc đơn và metacharacters, khiến chúng khó đọc và hiểu.

Đối với độ phân giải như vậy, việc chỉ định cờ

[?> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
37 tương đương với
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
38 không thể đọc được, nhưng
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
39 vẫn sẽ khớp với các ký tự
>>> import re
>>> p = re.compile['[a-z]+']
>>> p
re.compile['[a-z]+']
8,
[?:filename=][[^\.]*]\.[\w*]
33 hoặc một không gian. Ngoài ra, bạn cũng có thể đặt nhận xét bên trong một RE; Nhận xét mở rộng từ một ký tự
>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
42 sang dòng mới tiếp theo. Khi được sử dụng với các chuỗi được trích xuất ba, điều này cho phép RES được định dạng gọn gàng hơn:

. ^ $ * + ? { } [ ] \ | [ ]
7

Điều này dễ đọc hơn nhiều so với:

. ^ $ * + ? { } [ ] \ | [ ]
8

Nhận xét¶

Biểu thức thường xuyên là một chủ đề phức tạp. Tài liệu này có giúp bạn hiểu chúng không? Có những phần không rõ ràng, hoặc những vấn đề bạn gặp phải mà người sói được bao phủ ở đây? Nếu vậy, xin vui lòng gửi đề xuất để cải thiện cho tác giả.

Cuốn sách hoàn chỉnh nhất về các cách diễn đạt thường xuyên là gần như chắc chắn là Jeffrey Friedl, làm chủ các biểu thức thông thường, được xuất bản bởi O hèReilly. Thật không may, nó chỉ tập trung vào hương vị Perl và Java, của các biểu thức thông thường, và không chứa bất kỳ tài liệu Python nào, vì vậy nó đã giành được hữu ích như một tài liệu tham khảo cho lập trình trong Python. [Phiên bản đầu tiên bao gồm mô-đun

>>> import re
>>> p = re.compile['ab*']
>>> p
re.compile['ab*']
43 đã được loại bỏ Python, đã giành được giúp bạn rất nhiều.] Hãy xem xét kiểm tra nó từ thư viện của bạn.

Bài Viết Liên Quan

Chủ Đề