Python regex bất kỳ ký tự nào kể cả dòng mới

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ới

Có 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ước

Giả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[]
9

import 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'][]
2

function 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;

Làm cách nào để bao gồm ký tự dòng mới trong regex?

"\n" khớp với ký tự xuống dòng.

\W bao gồm những gì trong regex?

\w [ký tự từ] khớp với bất kỳ chữ cái, số hoặc dấu gạch dưới nào [giống như [a-zA-Z0-9_] ]. Đối tác chữ hoa \W [ký tự không phải từ] khớp với bất kỳ ký tự đơn nào không khớp với \w [giống như [^a-zA-Z0-9_] ]. Trong regex, ký tự meta chữ hoa luôn là nghịch đảo của ký tự chữ thường.

\s có khớp với regex dòng mới không?

Theo regex101. com\s. Khớp với mọi khoảng trắng, tab hoặc ký tự xuống dòng .

*$ trong regex là gì?

. * therefore means một chuỗi tùy ý có độ dài tùy ý . ^ cho biết phần đầu của chuỗi. $ chỉ ra phần cuối của chuỗi.

Chủ Đề