Tôi muốn sử dụng but NOT , để tôi có thể có biểu thức chính quy bao gồm cả ký tự đại diện "bất kỳ ký tự nào" và ký tự đại diện
import foo
method_to_call = getattr[foo, 'bar']
result = method_to_call[]
0 bình thường không khớp với dòng mớiCó cách nào để làm việc này không?
Giải pháp tốt nhất
Để khớp với một dòng mới hoặc "bất kỳ biểu tượng nào" mà không có
import foo
method_to_call = getattr[foo, 'bar']
result = method_to_call[]
1/re.DOTALL
, bạn có thể sử dụng bất kỳ cách nào sau đây[\s\S]
[\w\W]
[\d\D]
Ý tưởng chính là các lớp tốc ký ngược lại bên trong một lớp ký tự khớp với bất kỳ ký hiệu nào có trong chuỗi đầu vào
So sánh nó với
import foo
method_to_call = getattr[foo, 'bar']
result = method_to_call[]
3 và các biến thể khác với sự xen kẽ, giải pháp lớp ký tự hiệu quả hơn nhiều vì nó liên quan đến việc quay lui ít hơn nhiều [khi được sử dụng với bộ định lượng import foo
method_to_call = getattr[foo, 'bar']
result = method_to_call[]
4 hoặc ________0____5]. So sánh ví dụ nhỏ. mất import foo
method_to_call = getattr[foo, 'bar']
result = method_to_call[]
6 45 bước để hoàn thành và mất import foo
method_to_call = getattr[foo, 'bar']
result = method_to_call[]
7 chỉ 2 bướcGiải pháp liên quan
Python – Gọi một chức năng của một mô-đun bằng cách sử dụng tên của nó [một chuỗi]
Giả sử mô-đun
import foo
method_to_call = getattr[foo, 'bar']
result = method_to_call[]
8 với phương pháp import foo
method_to_call = getattr[foo, 'bar']
result = method_to_call[]
9import foo
method_to_call = getattr[foo, 'bar']
result = method_to_call[]
Bạn có thể rút ngắn dòng 2 và 3 thành
result = getattr[foo, 'bar'][]
nếu điều đó có ý nghĩa hơn đối với trường hợp sử dụng của bạn
Bạn có thể sử dụng theo cách này trên các phương thức liên kết thể hiện lớp, phương thức cấp mô-đun, phương thức lớp. Danh sách cứ kéo dài
Javascript – Cách truy cập các nhóm phù hợp trong biểu thức chính quy JavaScript
Bạn có thể truy cập các nhóm chụp như thế này
var myString = "something format_abc";
var myRegexp = /[?:^|\s]format_[.*?][?:\s|$]/g;
var myRegexp = new RegExp["[?:^|\s]format_[.*?][?:\s|$]", "g"];
var match = myRegexp.exec[myString];
console.log[match[1]]; // abc
Và nếu có nhiều trận đấu, bạn có thể lặp lại chúng
var myString = "something format_abc";
var myRegexp = new RegExp["[?:^|\s]format_[.*?][?:\s|$]", "g"];
match = myRegexp.exec[myString];
while [match != null] {
// matched text: match[0]
// match start: match.index
// capturing group n: match[n]
console.log[match[0]]
match = myRegexp.exec[myString];
}
Biên tập. 2019-09-10
Như bạn có thể thấy cách lặp qua nhiều lần so khớp không trực quan lắm. Điều này dẫn đến đề xuất của phương pháp
result = getattr[foo, 'bar'][]
1. Phương pháp mới này dự kiến sẽ xuất xưởng trong. Nó cung cấp cho chúng tôi một API rõ ràng và giải quyết nhiều vấn đề. Nó đã bắt đầu cập bến các trình duyệt và công cụ JS chính là Chrome 73+ / Node 12+ và Firefox 67+Phương thức trả về một iterator và được sử dụng như sau
const string = "something format_abc";
const regexp = /[?:^|\s]format_[.*?][?:\s|$]/g;
const matches = string.matchAll[regexp];
for [const match of matches] {
console.log[match];
console.log[match.index]
}
Vì nó trả về một trình vòng lặp, chúng ta có thể nói nó lười biếng, điều này rất hữu ích khi xử lý số lượng lớn các nhóm bắt giữ hoặc các chuỗi rất lớn. Nhưng nếu bạn cần, kết quả có thể dễ dàng chuyển đổi thành Mảng bằng cách sử dụng cú pháp trải rộng hoặc phương thức
result = getattr[foo, 'bar'][]
2function getFirstGroup[regexp, str] {
const array = [...str.matchAll[regexp]];
return array.map[m => m[1]];
}
// or:
function getFirstGroup[regexp, str] {
return Array.from[str.matchAll[regexp], m => m[1]];
}
Trong thời gian chờ đợi, trong khi đề xuất này nhận được nhiều hỗ trợ hơn, bạn có thể sử dụng gói shim chính thức
Ngoài ra, hoạt động bên trong của phương pháp rất đơn giản. Việc triển khai tương đương bằng cách sử dụng hàm tạo sẽ như sau
function* matchAll[str, regexp] {
const flags = regexp.global ? regexp.flags : regexp.flags + "g";
const re = new RegExp[regexp, flags];
let match;
while [match = re.exec[str]] {
yield match;
}
}
Một bản sao của biểu thức chính quy gốc được tạo;