Kiểm tra xem chuỗi có chứa dấu gạch ngang Python không

Đối với điều này, hãy sử dụng toán tử LIKE. Trước tiên chúng ta hãy tạo một bảng

mysql> create table DemoTable
   [
   Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   Password varchar[100]
   ];
Query OK, 0 rows affected [1.27 sec]

Chèn một số bản ghi vào bảng bằng lệnh chèn -

mysql> insert into DemoTable[Password] values['John@--123'];
Query OK, 1 row affected [0.19 sec]
mysql> insert into DemoTable[Password] values['---Carol234'];
Query OK, 1 row affected [0.20 sec]
mysql> insert into DemoTable[Password] values['--David987'];
Query OK, 1 row affected [0.13 sec]
mysql> insert into DemoTable[Password] values['Mike----53443'];
Query OK, 1 row affected [0.30 sec]

Hiển thị tất cả các bản ghi từ bảng bằng cách sử dụng câu lệnh chọn

mysql> select *from DemoTable;

đầu ra

+----+---------------+
| Id | Password      |
+----+---------------+
| 1  | John@--123    |
| 2  | ---Carol234   |
| 3  | --David987    |
| 4  | Mike----53443 |
+----+---------------+
4 rows in set [0.00 sec]

Sau đây là truy vấn để truy xuất từ ​​MySQL nếu nó chỉ chứa hai ký hiệu gạch nối -

mysql> select *from DemoTable where Password like '%--%' and password not like '%---%';

đầu ra

+----+------------+
| Id | Password   |
+----+------------+
| 1  | John@--123 |
| 3  | --David987 |
+----+------------+
2 rows in set [0.06 sec]

Cập nhật ngày 30-Jul-2019 22. 30. 26

con trăn

lập trình

sợi dây

tách ra

gạch nối

dấu trừ

[Chỉnh sửa]

VN

Python - tách chuỗi bằng dấu gạch nối [dấu trừ - mã ascii 45]

2 người đóng góp

7 đóng góp

0 thảo luận

0 điểm

Được tạo bởi

Antonina-Trejo

327

Trong bài viết này, chúng tôi xin hướng dẫn bạn cách tách chuỗi bằng dấu gạch nối trong Python

giải pháp nhanh chóng

text = "split-this-text"

words = text.split["-"]
print[words]  # ['split', 'this', 'text']

 

Ví dụ thực tế

Trong ví dụ này, chúng tôi tách chuỗi text thành danh sách

mysql> insert into DemoTable[Password] values['John@--123'];
Query OK, 1 row affected [0.19 sec]
mysql> insert into DemoTable[Password] values['---Carol234'];
Query OK, 1 row affected [0.20 sec]
mysql> insert into DemoTable[Password] values['--David987'];
Query OK, 1 row affected [0.13 sec]
mysql> insert into DemoTable[Password] values['Mike----53443'];
Query OK, 1 row affected [0.30 sec]
0 bằng cách sử dụng phương pháp
mysql> insert into DemoTable[Password] values['John@--123'];
Query OK, 1 row affected [0.19 sec]
mysql> insert into DemoTable[Password] values['---Carol234'];
Query OK, 1 row affected [0.20 sec]
mysql> insert into DemoTable[Password] values['--David987'];
Query OK, 1 row affected [0.13 sec]
mysql> insert into DemoTable[Password] values['Mike----53443'];
Query OK, 1 row affected [0.30 sec]
1

text = "split-this-text"

words = text.split["-"]
print[words]  # ['split', 'this', 'text']

đầu ra

________số 8

Bạn có thể quen với việc tìm kiếm văn bản bằng cách nhấn CTRL-F và nhập các từ bạn đang tìm kiếm. Biểu thức chính quy tiến thêm một bước. chúng cho phép bạn chỉ định một mẫu văn bản để tìm kiếm. Bạn có thể không biết số điện thoại chính xác của doanh nghiệp, nhưng nếu bạn sống ở Hoa Kỳ hoặc Canada, bạn biết đó sẽ là ba chữ số, theo sau là dấu gạch ngang, rồi bốn chữ số nữa [và tùy chọn, mã vùng ba chữ số tại . Đây là cách bạn, với tư cách là một con người, biết một số điện thoại khi bạn nhìn thấy nó. 415-555-1234 là số điện thoại, nhưng 4,155,551,234 thì không

Chúng tôi cũng nhận ra tất cả các loại mẫu văn bản khác mỗi ngày. địa chỉ email có ký hiệu @ ở giữa, số an sinh xã hội của Hoa Kỳ có chín chữ số và hai dấu gạch ngang, URL trang web thường có dấu chấm và dấu gạch chéo về phía trước, tiêu đề tin tức sử dụng chữ hoa đầu trang, thẻ bắt đầu bằng # trên mạng xã hội bắt đầu bằng # và không chứa dấu cách, v.v.

Các biểu thức chính quy rất hữu ích, nhưng ít người không phải là lập trình viên biết về chúng mặc dù hầu hết các trình soạn thảo văn bản và trình xử lý văn bản hiện đại, chẳng hạn như Microsoft Word hoặc OpenOffice, đều có các tính năng tìm và tìm và thay thế có thể tìm kiếm dựa trên các biểu thức chính quy. Các biểu thức chính quy tiết kiệm rất nhiều thời gian, không chỉ cho người dùng phần mềm mà còn cho các lập trình viên. Trên thực tế, nhà văn công nghệ Cory Doctorow lập luận rằng chúng ta nên dạy các biểu thức chính quy ngay cả trước khi lập trình

Biết [biểu thức chính quy] có thể có nghĩa là sự khác biệt giữa giải quyết vấn đề trong 3 bước và giải quyết vấn đề đó trong 3.000 bước. Khi bạn là một con mọt sách, bạn quên rằng những vấn đề bạn giải quyết bằng một vài lần nhấn phím có thể khiến người khác mất nhiều ngày làm việc tẻ nhạt, dễ mắc lỗi để giải quyết. 1

Trong chương này, bạn sẽ bắt đầu bằng cách viết một chương trình để tìm các mẫu văn bản mà không sử dụng các biểu thức chính quy và sau đó xem cách sử dụng các biểu thức chính quy để làm cho mã bớt cồng kềnh hơn nhiều. Tôi sẽ chỉ cho bạn cách khớp cơ bản với các biểu thức chính quy và sau đó chuyển sang một số tính năng mạnh mẽ hơn, chẳng hạn như thay thế chuỗi và tạo các lớp ký tự của riêng bạn. Cuối cùng, ở cuối chương này, bạn sẽ viết một chương trình có thể tự động trích xuất số điện thoại và địa chỉ email từ một khối văn bản

Tìm các mẫu văn bản không có biểu thức chính quy

Giả sử bạn muốn tìm một số điện thoại của Mỹ trong một chuỗi. Bạn biết mô hình nếu bạn là người Mỹ. ba số, một gạch nối, ba số, một gạch nối và bốn số. Đây là một ví dụ. 415-555-4242

Hãy sử dụng một hàm có tên isPhoneNumber[] để kiểm tra xem một chuỗi có khớp với mẫu này hay không, trả về True hoặc False. Mở tab trình chỉnh sửa tệp mới và nhập mã sau; . py

def isPhoneNumber[text].
  ➊ if len[text]. = 12.
         trả về Sai
     cho tôi trong phạm vi [0, 3].
      ➋ nếu không nhắn tin[i]. là thập phân[].
              trả về Sai
  ➌ nếu văn bản[3]. = '-'.
         trả về Sai
     cho i trong phạm vi [4, 7].
      ➍ nếu không nhắn tin[i]. là thập phân[].
              trả về Sai
  ➎ nếu văn bản[7]. = '-'.
         trả về Sai
     cho i trong phạm vi[8, 12].
      ➏ nếu không nhắn tin[i]. là thập phân[].
              trả về Sai
  ➐ trả về Đúng

print['415-555-4242 có phải là số điện thoại không?']
print[isPhoneNumber['415-555-4242']]
print['Is Moshi moshi a phone number?']
print[isPhoneNumber['Moshi moshi']]

Khi chương trình này được chạy, đầu ra trông như thế này

415-555-4242 có phải là số điện thoại không?
Đúng
Moshi moshi có phải là số điện thoại không?
False

Hàm isPhoneNumber[] có mã thực hiện một số kiểm tra xem chuỗi trong văn bản có phải là số điện thoại hợp lệ hay không. Nếu bất kỳ kiểm tra nào không thành công, hàm sẽ trả về Sai. Đầu tiên, mã kiểm tra xem chuỗi có chính xác 12 ký tự không ➊. Sau đó, nó kiểm tra xem mã vùng [nghĩa là ba ký tự đầu tiên trong văn bản] chỉ bao gồm các ký tự số ➋. Phần còn lại của chức năng kiểm tra xem chuỗi có tuân theo mẫu số điện thoại không. số phải có dấu gạch nối đầu tiên sau mã vùng ➌, ba ký tự số khác ➍, sau đó là dấu gạch nối khác ➎ và cuối cùng là bốn số khác ➏. Nếu việc thực thi chương trình quản lý để vượt qua tất cả các kiểm tra, nó sẽ trả về True ➐

Gọi isPhoneNumber[] với đối số '415-555-4242' sẽ trả về True. Gọi isPhoneNumber[] bằng 'Moshi moshi' sẽ trả về Sai;

Nếu bạn muốn tìm số điện thoại trong một chuỗi lớn hơn, bạn sẽ phải thêm nhiều mã hơn nữa để tìm mẫu số điện thoại. Thay thế bốn lệnh gọi hàm print[] cuối cùng trong isPhoneNumber. py với những điều sau đây

message = 'Gọi cho tôi theo số 415-555-1011 vào ngày mai. 415-555-9999 là văn phòng của tôi. '
cho tôi trong phạm vi[len[tin nhắn]].
  ➊ chunk = message[i. i+12]
  ➋ if isPhoneNumber[chunk].
          print['Đã tìm thấy số điện thoại. ' + chunk]
print['Xong']

Khi chương trình này chạy, đầu ra sẽ như thế này

Đã tìm thấy số điện thoại. 415-555-1011
Đã tìm thấy số điện thoại. 415-555-9999
Xong

Trên mỗi lần lặp của vòng lặp for, một đoạn mới gồm 12 ký tự từ tin nhắn được gán cho đoạn biến ➊. Ví dụ: trong lần lặp đầu tiên, i là 0 và chunk được gán message[0. 12] [nghĩa là chuỗi 'Gọi cho tôi lúc 4 giờ']. Ở lần lặp tiếp theo, i là 1 và chunk được gán thông báo[1. 13] [chuỗi 'tất cả tôi ở tuổi 41']. Nói cách khác, trên mỗi lần lặp của vòng lặp for, chunk nhận các giá trị sau

  • 'Gọi cho tôi lúc 4'
  • 'tất cả tôi ở tuổi 41'
  • 'll me at 415'
  • 'Tôi ở 415-'
  • . . và như thế

Bạn chuyển đoạn mã tới isPhoneNumber[] để xem nó có khớp với mẫu số điện thoại ➋ hay không và nếu đúng, bạn in đoạn mã đó

Tiếp tục lặp qua tin nhắn và cuối cùng 12 ký tự trong đoạn sẽ là số điện thoại. Vòng lặp đi qua toàn bộ chuỗi, kiểm tra từng phần gồm 12 ký tự và in bất kỳ đoạn nào mà nó thấy thỏa mãn isPhoneNumber[]. Khi chúng tôi hoàn thành việc duyệt qua tin nhắn, chúng tôi sẽ in Xong

Mặc dù chuỗi trong thông báo ngắn trong ví dụ này, nhưng nó có thể dài hàng triệu ký tự và chương trình vẫn sẽ chạy trong chưa đầy một giây. Một chương trình tương tự tìm số điện thoại bằng biểu thức chính quy cũng sẽ chạy trong chưa đầy một giây, nhưng biểu thức chính quy giúp viết các chương trình này nhanh hơn

Tìm mẫu văn bản với biểu thức chính quy

Chương trình tìm số điện thoại trước đó hoạt động, nhưng nó sử dụng rất nhiều mã để thực hiện một số việc hạn chế. hàm isPhoneNumber[] dài 17 dòng nhưng chỉ tìm được một mẫu số điện thoại. Điều gì về một số điện thoại được định dạng như 415. 555. 4242 hoặc [415] 555-4242? . Bạn có thể thêm nhiều mã hơn cho các mẫu bổ sung này, nhưng có một cách dễ dàng hơn

Biểu thức chính quy, gọi tắt là biểu thức chính quy, là mô tả cho một mẫu văn bản. Ví dụ: \d trong biểu thức chính quy là viết tắt của ký tự chữ số—nghĩa là bất kỳ chữ số đơn nào từ 0 đến 9. Regex \d\d\d-\d\d\d-\d\d\d\d được Python sử dụng để khớp với cùng một mẫu văn bản mà hàm isPhoneNumber[] trước đó đã làm. một chuỗi gồm ba số, một dấu gạch nối, ba số khác, một dấu gạch nối khác và bốn số. Bất kỳ chuỗi nào khác sẽ không khớp với biểu thức chính quy \d\d\d-\d\d\d-\d\d\d\d

Nhưng các biểu thức chính quy có thể phức tạp hơn nhiều. Ví dụ: thêm số 3 trong dấu ngoặc nhọn [{3}] sau một mẫu giống như nói: “Hãy ghép mẫu này ba lần. ” Vì vậy, biểu thức chính quy ngắn hơn một chút \d{3}-\d{3}-\d{4} cũng khớp với định dạng số điện thoại chính xác

Tạo đối tượng Regex

Tất cả các hàm regex trong Python đều có trong mô-đun re. Nhập thông tin sau vào trình bao tương tác để nhập mô-đun này

>>> nhập lại

GHI CHÚ

Hầu hết các ví dụ trong chương này sẽ yêu cầu mô-đun re, vì vậy hãy nhớ nhập nó vào đầu bất kỳ tập lệnh nào bạn viết hoặc bất kỳ lúc nào bạn khởi động lại Mu. Nếu không, bạn sẽ nhận được NameError. tên 'lại' không được xác định thông báo lỗi

Chuyển một giá trị chuỗi đại diện cho biểu thức chính quy của bạn tới re. compile[] trả về một đối tượng mẫu Regex [hoặc đơn giản là một đối tượng Regex]

Để tạo đối tượng Regex khớp với mẫu số điện thoại, hãy nhập thông tin sau vào trình bao tương tác. [Hãy nhớ rằng \d có nghĩa là “ký tự chữ số” và \d\d\d-\d\d\d-\d\d\d\d là biểu thức chính quy cho mẫu số điện thoại. ]

>>> phoneNumRegex = lại. biên dịch [r'\d\d\d-\d\d\d-\d\d\d\d']

Bây giờ biến phoneNumRegex chứa một đối tượng Regex

Khớp các đối tượng Regex

Phương thức search[] của đối tượng Regex tìm kiếm chuỗi mà nó được truyền để tìm bất kỳ kết quả khớp nào với biểu thức chính quy. Phương thức search[] sẽ trả về Không nếu không tìm thấy mẫu biểu thức chính quy trong chuỗi. Nếu mẫu được tìm thấy, phương thức search[] trả về một đối tượng Match, có phương thức group[] sẽ trả về văn bản khớp thực tế từ chuỗi đã tìm kiếm. [Tôi sẽ giải thích các nhóm ngay. ] Ví dụ: nhập thông tin sau vào trình bao tương tác

>>> phoneNumRegex = lại. biên dịch[r'\d\d\d-\d\d\d-\d\d\d\d']
>>> mo = phoneNumRegex. search['Số của tôi là 415-555-4242. ']
>>> print['Đã tìm thấy số điện thoại. ' + mo. group[]]
Đã tìm thấy số điện thoại. 415-555-4242

Tên biến mo chỉ là một tên chung để sử dụng cho các đối tượng Match. Ví dụ này thoạt nghe có vẻ phức tạp, nhưng nó ngắn hơn nhiều so với isPhoneNumber trước đó. chương trình py và làm điều tương tự

Ở đây, chúng tôi chuyển mẫu mong muốn của mình sang lại. compile[] và lưu trữ đối tượng Regex kết quả trong phoneNumRegex. Sau đó, chúng tôi gọi search[] trên phoneNumRegex và chuyển search[] chuỗi mà chúng tôi muốn đối sánh trong quá trình tìm kiếm. Kết quả tìm kiếm được lưu trữ trong biến mo. Trong ví dụ này, chúng tôi biết rằng mẫu của chúng tôi sẽ được tìm thấy trong chuỗi, vì vậy chúng tôi biết rằng đối tượng Match sẽ được trả về. Biết rằng mo chứa đối tượng Match chứ không phải giá trị null Không có, chúng ta có thể gọi group[] trên mo để trả về kết quả khớp. viết mo. group[] bên trong lệnh gọi hàm print[] của chúng tôi hiển thị toàn bộ kết quả khớp, 415-555-4242

Xem xét Đối sánh biểu thức chính quy

Mặc dù có một số bước để sử dụng biểu thức chính quy trong Python, nhưng mỗi bước đều khá đơn giản

  1. Nhập mô-đun regex với nhập lại
  2. Tạo một đối tượng Regex với re. chức năng biên dịch[]. [Hãy nhớ sử dụng một chuỗi thô. ]
  3. Truyền chuỗi bạn muốn tìm kiếm vào phương thức search[] của đối tượng Regex. Điều này trả về một đối tượng Match
  4. Gọi phương thức group[] của đối tượng Match để trả về một chuỗi văn bản khớp thực tế

GHI CHÚ

Mặc dù tôi khuyến khích bạn nhập mã ví dụ vào trình bao tương tác, nhưng bạn cũng nên sử dụng trình kiểm tra biểu thức chính quy dựa trên web, công cụ này có thể cho bạn biết chính xác cách biểu thức chính quy khớp với đoạn văn bản mà bạn nhập. Tôi khuyên bạn nên thử nghiệm tại https. //pythex. tổ chức/

Khớp mẫu hơn với biểu thức chính quy

Bây giờ bạn đã biết các bước cơ bản để tạo và tìm các đối tượng biểu thức chính quy bằng Python, bạn đã sẵn sàng thử một số khả năng khớp mẫu mạnh mẽ hơn của chúng

Nhóm với dấu ngoặc đơn

Giả sử bạn muốn tách mã vùng khỏi phần còn lại của số điện thoại. Thêm dấu ngoặc đơn sẽ tạo các nhóm trong regex. [\d\d\d]-[\d\d\d-\d\d\d\d]. Sau đó, bạn có thể sử dụng phương thức đối tượng khớp nhóm[] để lấy văn bản khớp từ chỉ một nhóm

Bộ dấu ngoặc đơn đầu tiên trong chuỗi biểu thức chính quy sẽ là nhóm 1. Bộ thứ hai sẽ là nhóm 2. Bằng cách chuyển số nguyên 1 hoặc 2 cho phương thức đối tượng khớp nhóm[], bạn có thể lấy các phần khác nhau của văn bản khớp. Truyền 0 hoặc không có gì cho phương thức group[] sẽ trả về toàn bộ văn bản khớp. Nhập thông tin sau vào vỏ tương tác

>>> phoneNumRegex = lại. biên dịch[r'[\d\d\d]-[\d\d\d-\d\d\d\d]']
>>> mo = phoneNumRegex. search['Số của tôi là 415-555-4242. ']
>>> mo. nhóm[1]
'415'
>>> mo. nhóm[2]
'555-4242'
>>> mo. nhóm[0]
'415-555-4242'
>>> mo. nhóm[]
'415-555-4242'

Nếu bạn muốn truy xuất tất cả các nhóm cùng một lúc, hãy sử dụng phương thức groups[]—lưu ý dạng số nhiều của tên

>>> mo. groups[]
['415', '555-4242']
>>> Mã vùng, mainNumber = mo. nhóm[]
>>> in[mã vùng]
415
>>> in[số chính]
555-4242

kể từ mo. groups[] trả về một bộ gồm nhiều giá trị, bạn có thể sử dụng thủ thuật gán nhiều giá trị để gán từng giá trị cho một biến riêng biệt, như trong Mã vùng trước đó, mainNumber = mo. nhóm [] dòng

Dấu ngoặc đơn có ý nghĩa đặc biệt trong biểu thức chính quy, nhưng bạn sẽ làm gì nếu cần khớp dấu ngoặc đơn trong văn bản của mình? . Trong trường hợp này, bạn cần thoát ký tự [ và ] bằng dấu gạch chéo ngược. Nhập thông tin sau vào vỏ tương tác

>>> phoneNumRegex = lại. biên dịch[r'[\[\d\d\d\]] [\d\d\d-\d\d\d\d]']
>>> mo = phoneNumRegex. search['Số điện thoại của tôi là [415] 555-4242. ']
>>> mo. nhóm[1]
'[415]'
>>> mo. nhóm[2]
'555-4242'

Các ký tự thoát \[ và \] trong chuỗi thô được chuyển tới. compile[] sẽ khớp với các ký tự trong ngoặc đơn thực tế. Trong biểu thức chính quy, các ký tự sau đây có ý nghĩa đặc biệt

^  $  *  +  ? . [  ]

Nếu bạn muốn phát hiện những ký tự này như một phần của mẫu văn bản của mình, bạn cần thoát chúng bằng dấu gạch chéo ngược

\. \^  \$  \*  \+  \? . \[  \]

Đảm bảo kiểm tra kỹ xem bạn có nhầm lẫn dấu ngoặc đơn thoát \[ và \] với dấu ngoặc đơn [ và ] trong biểu thức chính quy không. Nếu bạn nhận được thông báo lỗi về “thiếu ]” hoặc “dấu ngoặc đơn không cân bằng”, thì có thể bạn đã quên bao gồm dấu ngoặc đơn đóng không thoát cho một nhóm, như trong ví dụ này

>>> lại. compile[r'[\[Dấu ngoặc đơn\]']
Traceback [lần gọi gần đây nhất].
    --snip--
re. lỗi. thiếu ], mẫu con chưa kết thúc ở vị trí 0

Thông báo lỗi cho bạn biết rằng có một dấu ngoặc đơn mở ở chỉ mục 0 của chuỗi r'[\[Dấu ngoặc đơn\]' bị thiếu dấu ngoặc đơn đóng tương ứng

Kết hợp nhiều nhóm với đường ống

Các. nhân vật được gọi là một đường ống. Bạn có thể sử dụng nó ở bất cứ đâu bạn muốn khớp với một trong nhiều biểu thức. Ví dụ: biểu thức chính quy r'Batman. Tina Fey' sẽ phù hợp với 'Batman' hoặc 'Tina Fey'

Khi cả Batman và Tina Fey xuất hiện trong chuỗi được tìm kiếm, lần xuất hiện đầu tiên của văn bản phù hợp sẽ được trả về dưới dạng đối tượng Match. Nhập thông tin sau vào vỏ tương tác

>>> heroRegex = lại. biên dịch [r'Batman. Tina Fey']
>>> mo1 = heroRegex. tìm kiếm['Batman và Tina Fey']
>>> mo1. nhóm[]
'Người dơi'

>>> mo2 = heroRegex. tìm kiếm['Tina Fey và Batman']
>>> mo2. nhóm[]
'Tina Fey'

Bạn cũng có thể sử dụng đường ống để khớp với một trong số các mẫu như một phần của biểu thức chính quy của mình. Ví dụ: giả sử bạn muốn khớp bất kỳ chuỗi nào trong số các chuỗi 'Batman', 'Batmobile', 'Batcopter' và 'Batbat'. Vì tất cả các chuỗi này đều bắt đầu bằng Bat, sẽ rất tuyệt nếu bạn chỉ có thể chỉ định tiền tố đó một lần. Điều này có thể được thực hiện với dấu ngoặc đơn. Nhập thông tin sau vào vỏ tương tác

>>> batRegex = lại. biên dịch [r'Bat [người đàn ông. di động. trực thăng. bat]']
>>> mo = batRegex. search['Batmobile bị mất bánh']
>>> mo. group[]
'Batmobile'
>>> mo. nhóm[1]
'di động'

Phương thức gọi mo. group[] trả về văn bản phù hợp đầy đủ 'Batmobile', trong khi mo. nhóm[1] chỉ trả về một phần của văn bản phù hợp bên trong nhóm dấu ngoặc đơn đầu tiên, 'di động'. Bằng cách sử dụng ký tự đường ống và nhóm các dấu ngoặc đơn, bạn có thể chỉ định một số mẫu thay thế mà bạn muốn biểu thức chính quy của mình khớp với

Nếu bạn cần khớp một ký tự đường ống thực, hãy thoát ký tự đó bằng dấu gạch chéo ngược, chẳng hạn như \

Kết hợp tùy chọn với Dấu chấm hỏi

Đôi khi có một mẫu mà bạn chỉ muốn khớp tùy chọn. Nghĩa là, biểu thức chính quy sẽ tìm thấy kết quả khớp bất kể có đoạn văn bản đó hay không. Các ? . Ví dụ: nhập thông tin sau vào trình bao tương tác

>>> batRegex = lại. biên dịch[r'Bat[wo]?man']
>>> mo1 = batRegex. search['Cuộc phiêu lưu của Người Dơi']
>>> mo1. nhóm[]
'Người dơi'

>>> mo2 = batRegex. search['Cuộc phiêu lưu của Batwoman']
>>> mo2. group[]
'Batwoman'

Các [wo]? . Regex sẽ khớp với văn bản không có phiên bản nào hoặc có một phiên bản wo trong đó. Đây là lý do tại sao regex khớp với cả 'Batwoman' và 'Batman'

Sử dụng ví dụ về số điện thoại trước đó, bạn có thể làm cho biểu thức chính quy tìm kiếm các số điện thoại có hoặc không có mã vùng. Nhập thông tin sau vào vỏ tương tác

>>> phoneRegex = lại. biên dịch[r'[\d\d\d-]?\d\d\d-\d\d\d\d']
>>> mo1 = phoneRegex. search['Số của tôi là 415-555-4242']
>>>mo1. nhóm[]
'415-555-4242'

>>> mo2 = phoneRegex. tìm kiếm['Số của tôi là 555-4242']
>>>mo2. nhóm[]
'555-4242'

Bạn có thể nghĩ về? . ”

Nếu bạn cần khớp một ký tự dấu chấm hỏi thực tế, hãy thoát ký tự đó bằng \?

So khớp từ 0 trở lên với Ngôi sao

Dấu * [được gọi là dấu sao hoặc dấu hoa thị] có nghĩa là “khớp với 0 hoặc nhiều hơn”—nhóm đứng trước dấu sao có thể xuất hiện nhiều lần bất kỳ trong văn bản. Nó có thể hoàn toàn vắng mặt hoặc lặp đi lặp lại nhiều lần. Hãy xem lại ví dụ về Batman

>>> batRegex = lại. biên dịch[r'Bat[wo]*man']
>>> mo1 = batRegex. search['Cuộc phiêu lưu của Người Dơi']
>>> mo1. nhóm[]
'Người dơi'

>>> mo2 = batRegex. search['Cuộc phiêu lưu của Batwoman']
>>> mo2. group[]
'Batwoman'

>>> mo3 = batRegex. search['Những cuộc phiêu lưu của Batwowowowoman']
>>> mo3. group[]
'Batwowowowowoman'

Đối với 'Người dơi', phần [wo]* của biểu thức chính quy khớp với 0 trường hợp của wo trong chuỗi;

Nếu bạn cần khớp một ký tự dấu sao thực, hãy thêm dấu gạch chéo ngược vào trước dấu sao trong biểu thức chính quy, \*

Kết hợp một hoặc nhiều với Plus

Trong khi * có nghĩa là “khớp với 0 hoặc nhiều hơn”, dấu + [hoặc dấu cộng] có nghĩa là “khớp với một hoặc nhiều. ” Không giống như ngôi sao, không yêu cầu nhóm của nó xuất hiện trong chuỗi phù hợp, nhóm đứng trước dấu cộng phải xuất hiện ít nhất một lần. Nó không phải là tùy chọn. Nhập thông tin sau vào trình bao tương tác và so sánh nó với biểu thức sao trong phần trước

>>> batRegex = lại. biên dịch[r'Bat[wo]+man']
>>> mo1 = batRegex. search['Cuộc phiêu lưu của Batwoman']
>>> mo1. group[]
'Batwoman'

>>> mo2 = batRegex. search['Những cuộc phiêu lưu của Batwowowowoman']
>>> mo2. group[]
'Batwowowowowoman'

>>> mo3 = batRegex. search['Cuộc phiêu lưu của Người Dơi']
>>> mo3 == Không có
True

Regex Bat[wo]+man sẽ không khớp với chuỗi 'The Adventures of Batman', bởi vì ít nhất một wo được yêu cầu bởi dấu cộng

Nếu bạn cần khớp một ký tự dấu cộng thực tế, hãy thêm dấu gạch chéo ngược vào trước dấu cộng để thoát ký tự đó. \+

Kết hợp các lần lặp lại cụ thể với dấu ngoặc nhọn

Nếu bạn có một nhóm mà bạn muốn lặp lại một số lần cụ thể, hãy theo dõi nhóm trong biểu thức chính quy của bạn với một số trong dấu ngoặc nhọn. Ví dụ: biểu thức chính quy [Ha]{3} sẽ khớp với chuỗi 'HaHaHa', nhưng nó sẽ không khớp với 'HaHa', vì chuỗi sau chỉ có hai lần lặp lại của nhóm [Ha]

Thay vì một số, bạn có thể chỉ định một phạm vi bằng cách viết giá trị tối thiểu, dấu phẩy và giá trị tối đa ở giữa các dấu ngoặc nhọn. Ví dụ: biểu thức chính quy [Ha]{3,5} sẽ khớp với 'HaHaHa', 'HaHaHaHa' và 'HaHaHaHaHa'

Bạn cũng có thể bỏ qua số đầu tiên hoặc số thứ hai trong dấu ngoặc nhọn để không bị chặn tối thiểu hoặc tối đa. Ví dụ: [Ha]{3,} sẽ khớp với ba hoặc nhiều phiên bản của nhóm [Ha], trong khi [Ha]{,5} sẽ khớp từ 0 đến năm phiên bản. Niềng răng có thể giúp làm cho biểu thức chính quy của bạn ngắn hơn. Hai biểu thức chính quy này khớp với các mẫu giống hệt nhau

[Ha]{3}
[Ha][Ha][Ha]

Và hai biểu thức chính quy này cũng khớp với các mẫu giống hệt nhau

[Ha]{3,5}
[[Ha][Ha][Ha]]. [[Ha][Ha][Ha][Ha]]. [[Ha][Ha][Ha][Ha][Ha]]

Nhập thông tin sau vào vỏ tương tác

>>> haRegex = lại. biên dịch[r'[Ha]{3}']
>>> mo1 = haRegex. tìm kiếm['HaHaHa']
>>> mo1. nhóm[]
'HaHaHa'

>>> mo2 = haRegex. tìm kiếm['Ha']
>>> mo2 == Không có
True

Ở đây, [Ha]{3} khớp với 'HaHaHa' nhưng không khớp với 'Ha'. Vì nó không khớp với 'Ha', tìm kiếm[] trả về Không có

Kết hợp tham lam và không tham lam

Vì [Ha]{3,5} có thể khớp với ba, bốn hoặc năm phiên bản của Ha trong chuỗi 'HaHaHaHaHa', nên bạn có thể thắc mắc tại sao lệnh gọi nhóm[] của đối tượng Match trong ví dụ trước lại trả về 'HaHaHaHaHa' thay vì . Xét cho cùng, 'HaHaHa' và 'HaHaHaHa' cũng là các đối sánh hợp lệ của biểu thức chính quy [Ha]{3,5}

Theo mặc định, các biểu thức chính quy của Python là tham lam, điều đó có nghĩa là trong các tình huống không rõ ràng, chúng sẽ khớp với chuỗi dài nhất có thể. Phiên bản không tham lam [còn gọi là lười biếng] của dấu ngoặc nhọn, khớp với chuỗi ngắn nhất có thể, có dấu ngoặc nhọn theo sau là dấu chấm hỏi

Nhập nội dung sau vào trình bao tương tác và nhận thấy sự khác biệt giữa dạng tham lam và không tham lam của dấu ngoặc nhọn tìm kiếm cùng một chuỗi

>>> tham lamHaRegex = lại. biên dịch[r'[Ha]{3,5}']
>>> mo1 = tham lamHaRegex. tìm kiếm['HaHaHaHaHa']
>>> mo1. nhóm[]
'HaHaHaHaHa'

>>> nongreedyHaRegex = lại. biên dịch[r'[Ha]{3,5}?']
>>> mo2 = nongreedyHaRegex. tìm kiếm['HaHaHaHaHa']
>>> mo2. nhóm[]
'HaHaHa'

Lưu ý rằng dấu chấm hỏi có thể có hai nghĩa trong biểu thức chính quy. tuyên bố một trận đấu không tham lam hoặc gắn cờ một nhóm tùy chọn. Những ý nghĩa này hoàn toàn không liên quan

Phương thức findall[]

Ngoài phương thức search[], đối tượng Regex còn có phương thức findall[]. Trong khi search[] sẽ trả về một đối tượng Match của văn bản khớp đầu tiên trong chuỗi được tìm kiếm, thì phương thức findall[] sẽ trả về các chuỗi của mọi kết quả khớp trong chuỗi được tìm kiếm. Để xem cách search[] trả về một đối tượng Match chỉ trong phiên bản đầu tiên của văn bản phù hợp, hãy nhập thông tin sau vào trình bao tương tác

>>> phoneNumRegex = lại. biên dịch[r'\d\d\d-\d\d\d-\d\d\d\d']
>>> mo = phoneNumRegex. tìm kiếm ['Ô. 415-555-9999 Công việc. 212-555-0000']
>>> mo. nhóm[]
'415-555-9999'

Mặt khác, findall[] sẽ không trả về một đối tượng Match mà là một danh sách các chuỗi—miễn là không có nhóm nào trong biểu thức chính quy. Mỗi chuỗi trong danh sách là một đoạn văn bản được tìm kiếm khớp với biểu thức chính quy. Nhập thông tin sau vào vỏ tương tác

>>> phoneNumRegex = lại. biên dịch[r'\d\d\d-\d\d\d-\d\d\d\d'] # không có nhóm
>>> phoneNumRegex. findall['Ô. 415-555-9999 Công việc. 212-555-0000']
['415-555-9999', '212-555-0000']

Nếu có các nhóm trong biểu thức chính quy, thì findall[] sẽ trả về một danh sách các bộ. Mỗi bộ đại diện cho một kết quả khớp được tìm thấy và các mục của nó là các chuỗi khớp cho mỗi nhóm trong biểu thức chính quy. Để xem hoạt động của findall[], hãy nhập thông tin sau vào trình bao tương tác [lưu ý rằng biểu thức chính quy đang được biên dịch hiện có các nhóm trong ngoặc đơn]

>>> phoneNumRegex = lại. compile[r'[\d\d\d]-[\d\d\d]-[\d\d\d\d]'] # có nhóm
>>> phoneNumRegex. findall['Ô. 415-555-9999 Công việc. 212-555-0000']
[['415', '555', '9999'], ['212', '555', '0000']]

Để tóm tắt những gì phương thức findall[] trả về, hãy nhớ những điều sau

  • Khi được gọi trên biểu thức chính quy không có nhóm nào, chẳng hạn như \d\d\d-\d\d\d-\d\d\d\d, phương thức findall[] trả về danh sách các chuỗi khớp, chẳng hạn như ['
  • Khi được gọi trên một biểu thức chính quy có các nhóm, chẳng hạn như [\d\d\d]-[\d\d\d]-[\d\d\d\d], phương thức findall[] trả về một danh sách các bộ

Lớp nhân vật

Trong ví dụ về biểu thức chính quy số điện thoại trước đó, bạn đã biết rằng \d có thể đại diện cho bất kỳ chữ số nào. Đó là, \d là cách viết tắt của biểu thức chính quy [0. 1. 2. 3. 4. 5. 6. 7. 8. 9]. Có nhiều lớp ký tự tốc ký như vậy, như trong Bảng 7-1

Bảng 7-1. Mã tốc ký cho các lớp nhân vật phổ biến

Lớp ký tự tốc ký

Đại diện

\d

Bất kỳ chữ số nào từ 0 đến 9

Bất kỳ ký tự nào không phải là chữ số từ 0 đến 9

\w

Bất kỳ chữ cái, chữ số hoặc ký tự gạch dưới. [Hãy coi đây là các ký tự “từ” phù hợp. ]

\W

Bất kỳ ký tự nào không phải là chữ cái, chữ số hoặc ký tự gạch dưới

\S

Bất kỳ dấu cách, tab hoặc ký tự xuống dòng nào. [Hãy coi đây là các ký tự “dấu cách” phù hợp. ]

\S

Bất kỳ ký tự nào không phải là khoảng trắng, tab hoặc dòng mới

Các lớp ký tự rất tốt để rút ngắn các biểu thức chính quy. Lớp ký tự [0-5] sẽ chỉ khớp với các số từ 0 đến 5; . 1. 2. 3. 4. 5]. Lưu ý rằng mặc dù \d khớp với các chữ số và \w khớp với các chữ số, chữ cái và dấu gạch dưới, nhưng không có lớp ký tự tốc ký nào chỉ khớp với các chữ cái. [Mặc dù bạn có thể sử dụng lớp ký tự [a-zA-Z], như được giải thích tiếp theo. ]

Ví dụ: nhập thông tin sau vào trình bao tương tác

>>> xmasRegex = lại. biên dịch[r'\d+\s\w+']
>>> xmasRegex. findall['12 người đánh trống, 11 người thổi sáo, 10 lãnh chúa, 9 quý cô, 8 người giúp việc, 7
thiên nga, 6 con ngỗng, 5 chiếc nhẫn, 4 con chim, 3 con gà mái, 2 con bồ câu, 1 con gà gô']>> nguyên âmRegex = lại. biên dịch[r'[aeiouAEIOU]']
>>> nguyên âmRegex. findall['RoboCop ăn thức ăn trẻ em. THỨC ĂN TRẺ EM. ']
['o', 'o', 'o', 'e', ​​'a', 'a', 'o', 'o', 'A', 'O

Bạn cũng có thể bao gồm các phạm vi chữ cái hoặc số bằng cách sử dụng dấu gạch nối. Ví dụ: lớp ký tự [a-zA-Z0-9] sẽ khớp với tất cả các chữ thường, chữ hoa và số

Lưu ý rằng bên trong dấu ngoặc vuông, các ký hiệu biểu thức chính quy thông thường không được hiểu như vậy. Điều này có nghĩa là bạn không cần phải thoát khỏi. Các ký tự , *, ?, hoặc [] có dấu gạch chéo ngược trước. Ví dụ, lớp ký tự [0-5. ] sẽ khớp với các chữ số từ 0 đến 5 và dấu chấm. Bạn không cần phải viết nó là [0-5\. ]

Bằng cách đặt một ký tự dấu mũ [^] ngay sau dấu ngoặc mở của lớp ký tự, bạn có thể tạo một lớp ký tự phủ định. Một lớp ký tự phủ định sẽ khớp với tất cả các ký tự không có trong lớp ký tự. Ví dụ: nhập thông tin sau vào trình bao tương tác

>>> phụ âmRegex = lại. biên dịch[r'[^aeiouAEIOU]']
>>> phụ âmRegex. findall['RoboCop ăn thức ăn trẻ em. THỨC ĂN TRẺ EM. ']
['R', 'b', 'C', 'p', ' ', 't', 's', ' ', 'b', 'b', . ', '
', 'B', 'B', 'Y', ' ', 'F', 'D', '. ']

Bây giờ, thay vì khớp từng nguyên âm, chúng tôi khớp mọi ký tự không phải là nguyên âm

Dấu mũ và ký tự đô la

Bạn cũng có thể sử dụng ký hiệu dấu mũ [^] ở đầu biểu thức chính quy để cho biết rằng một kết quả khớp phải xảy ra ở đầu văn bản được tìm kiếm. Tương tự như vậy, bạn có thể đặt ký hiệu đô la [$] ở cuối biểu thức chính quy để cho biết chuỗi phải kết thúc bằng mẫu biểu thức chính quy này. Và bạn có thể sử dụng ^ và $ cùng nhau để chỉ ra rằng toàn bộ chuỗi phải khớp với biểu thức chính quy—nghĩa là, không đủ để khớp được thực hiện trên một số tập hợp con của chuỗi

Ví dụ: chuỗi biểu thức chính quy r'^Hello' khớp với các chuỗi bắt đầu bằng 'Xin chào'. Nhập thông tin sau vào vỏ tương tác

>>> startedWithHello = lại. biên dịch [r'^Xin chào']
>>> bắt đầuWithXin chào. tìm kiếm ['Xin chào, thế giới. ']

>>> bắt đầuWithHello. tìm kiếm ['Anh ấy nói xin chào. '] == Không có
Đúng

Chuỗi biểu thức chính quy r'\d$' khớp với các chuỗi kết thúc bằng một ký tự số từ 0 đến 9. Nhập thông tin sau vào vỏ tương tác

>>> endWithNumber = re. biên dịch[r'\d$']
>>> endWithNumber. search['Số của bạn là 42']

>>> endWithNumber. search['Số của bạn là 42. '] == Không có
Đúng

Chuỗi biểu thức chính quy r'^\d+$' khớp với các chuỗi bắt đầu và kết thúc bằng một hoặc nhiều ký tự số. Nhập thông tin sau vào vỏ tương tác

>>> wholeStringIsNum = lại. biên dịch[r'^\d+$']
>>> wholeStringIsNum. tìm kiếm['1234567890']

>>> wholeStringIsNum. tìm kiếm['12345xyz67890'] == Không có
True
>>> wholeStringIsNum. tìm kiếm['12  34567890'] == Không
Đúng

Hai lệnh gọi search[] cuối cùng trong ví dụ trình bao tương tác trước đó minh họa cách toàn bộ chuỗi phải khớp với biểu thức chính quy nếu ^ và $ được sử dụng

Tôi luôn nhầm lẫn ý nghĩa của hai biểu tượng này, vì vậy tôi sử dụng câu nói dễ nhớ “Cà rốt giá đô la” để nhắc nhở bản thân rằng dấu mũ đứng trước và ký hiệu đô la đứng sau.

Ký tự đại diện

Các. [hoặc dấu chấm] trong biểu thức chính quy được gọi là ký tự đại diện và sẽ khớp với bất kỳ ký tự nào ngoại trừ ký tự xuống dòng. Ví dụ: nhập thông tin sau vào trình bao tương tác

>>> atRegex = lại. biên dịch [r'. at']
>>> atRegex. findall['Con mèo đội mũ ngồi trên tấm thảm phẳng. ']
['cat', 'hat', 'sat', 'lat', 'mat']

Hãy nhớ rằng ký tự dấu chấm sẽ chỉ khớp với một ký tự, đó là lý do tại sao khớp cho văn bản phẳng trong ví dụ trước chỉ khớp với vĩ độ. Để khớp với dấu chấm thực, hãy thoát khỏi dấu chấm bằng dấu gạch chéo ngược. \

Kết hợp mọi thứ với Dot-Star

Đôi khi bạn sẽ muốn khớp mọi thứ và mọi thứ. Ví dụ: giả sử bạn muốn khớp chuỗi 'Tên. ', tiếp theo là bất kỳ và tất cả văn bản, tiếp theo là 'Họ. ', và sau đó theo sau bởi bất cứ điều gì một lần nữa. Bạn có thể sử dụng dấu sao [. *] đại diện cho “bất cứ điều gì. ” Hãy nhớ rằng ký tự dấu chấm có nghĩa là “bất kỳ ký tự đơn nào ngoại trừ ký tự xuống dòng” và ký tự sao có nghĩa là “không hoặc nhiều ký tự trước đó. ”

Nhập thông tin sau vào vỏ tương tác

>>> tênRegex = lại. biên dịch [r'Tên. [. *] Họ. [. *]']
>>> mo = nameRegex. tìm kiếm ['Tên. Họ Tên. Sweigart']
>>> mo. nhóm[1]
'Al'
>>> mo. nhóm[2]
'Sweigart'

Ngôi sao chấm sử dụng chế độ tham lam. Nó sẽ luôn cố gắng khớp càng nhiều văn bản càng tốt. Để khớp bất kỳ và tất cả văn bản theo cách không tham lam, hãy sử dụng dấu chấm, dấu sao và dấu chấm hỏi [. *?]. Giống như với dấu ngoặc nhọn, dấu chấm hỏi cho Python khớp theo cách không tham lam

Nhập thông tin sau vào trình bao tương tác để thấy sự khác biệt giữa phiên bản tham lam và không tham lam

>>> nongreedyRegex = lại. biên dịch [r'
>>> mo = nongreedyRegex. tìm kiếm ['cho bữa ăn tối. >']
>>> mo. nhóm[]
''

>>> tham lamRegex = lại. biên dịch [r'
>>> mo = tham lamRegex. tìm kiếm ['cho bữa ăn tối. >']
>>> mo. group[]
'cho bữa tối. >'

Cả hai biểu thức chính quy được dịch đại khái là “Khớp với dấu ngoặc góc mở, theo sau là bất kỳ thứ gì, theo sau là dấu ngoặc góc đóng. ” Nhưng chuỗi 'cho bữa tối. >' có hai khả năng phù hợp với dấu ngoặc góc đóng. Trong phiên bản không tham lam của biểu thức chính quy, Python khớp với chuỗi ngắn nhất có thể. ''. Trong phiên bản tham lam, Python khớp với chuỗi dài nhất có thể. 'cho bữa tối. >'

Khớp các dòng mới với ký tự dấu chấm

Dấu sao sẽ khớp với mọi thứ trừ một dòng mới. Bằng cách chuyển lại. DOTALL làm đối số thứ hai cho re. compile[], bạn có thể làm cho ký tự dấu chấm khớp với tất cả các ký tự, kể cả ký tự xuống dòng

Nhập thông tin sau vào vỏ tương tác

>>> noNewlineRegex = lại. biên dịch ['. *']
>>> noNewlineRegex. search['Phục vụ niềm tin của công chúng. \nBảo vệ người vô tội.
\nDuy trì luật pháp. ']. group[]
'Phục vụ niềm tin của công chúng. '

>>> dòng mớiRegex = lại. biên dịch ['. *', lại. DOTALL]
>>> newlineRegex. search['Phục vụ niềm tin của công chúng. \nBảo vệ người vô tội.
\nDuy trì luật pháp. ']. group[]
'Phục vụ niềm tin của công chúng. \nBảo vệ người vô tội. \nDuy trì luật pháp. '

Regex không có Newline Regex, không có re. DOTALL chuyển đến lại. compile[] đã tạo ra nó, sẽ chỉ khớp mọi thứ với ký tự dòng mới đầu tiên, trong khi Regex dòng mới, đã có. DOTALL được chuyển đến lại. compile[], khớp với mọi thứ. Đây là lý do tại sao newlineRegex. lệnh gọi search[] khớp với chuỗi đầy đủ, bao gồm các ký tự dòng mới của nó

Đánh giá các biểu tượng Regex

Chương này bao gồm rất nhiều ký hiệu, vì vậy đây là phần đánh giá nhanh những gì bạn đã học về cú pháp biểu thức chính quy cơ bản

  • Các ?
  • * khớp với 0 hoặc nhiều nhóm trước đó
  • Dấu + khớp với một hoặc nhiều nhóm trước đó
  • {n} khớp chính xác n của nhóm trước
  • {n,} khớp với n hoặc nhiều hơn của nhóm trước
  • {,m} khớp từ 0 đến m của nhóm trước đó
  • {n,m} khớp với ít nhất n và nhiều nhất m của nhóm trước đó
  • {n,m}?
  • ^spam có nghĩa là chuỗi phải bắt đầu bằng thư rác
  • spam$ có nghĩa là chuỗi phải kết thúc bằng thư rác
  • Các. khớp với bất kỳ ký tự nào, ngoại trừ ký tự xuống dòng
  • \d, \w và \s lần lượt khớp với một chữ số, từ hoặc ký tự khoảng trắng
  • \D, \W và \S tương ứng với bất kỳ thứ gì ngoại trừ ký tự chữ số, từ hoặc khoảng trắng
  • [abc] khớp với bất kỳ ký tự nào giữa các dấu ngoặc [chẳng hạn như a, b hoặc c]
  • [^abc] khớp với bất kỳ ký tự nào không nằm trong dấu ngoặc

Kết hợp không phân biệt chữ hoa chữ thường

Thông thường, các biểu thức chính quy khớp văn bản với cách viết hoa chính xác mà bạn chỉ định. Ví dụ: các biểu thức chính quy sau khớp với các chuỗi hoàn toàn khác nhau

>>> regex1 = lại. biên dịch['RoboCop']
>>> regex2 = lại. biên dịch ['ROBOCOP']
>>> regex3 = lại. biên dịch ['robOcop']
>>> regex4 = lại. biên dịch['RobocOp']

Nhưng đôi khi bạn chỉ quan tâm đến việc ghép các chữ cái mà không cần quan tâm chúng là chữ hoa hay chữ thường. Để làm cho regex của bạn không phân biệt chữ hoa chữ thường, bạn có thể chuyển lại. IGNORECASE hoặc lại. tôi như một đối số thứ hai để lại. biên dịch[]. Nhập thông tin sau vào vỏ tương tác

>>> robocop = re. biên dịch [r'robocop', lại. I]
>>> robocop. search['RoboCop vừa là người, vừa là máy, vừa là cảnh sát. ']. nhóm[]
'RoboCop'

>>> người máy. search['ROBOCOP bảo vệ người vô tội. ']. nhóm[]
'ROBOCOP'

>>> người máy. search['Al, tại sao cuốn sách lập trình của bạn lại nói về robot nhiều như vậy?']. group[]
'robocop'

Thay thế chuỗi bằng phương thức sub[]

Biểu thức chính quy không chỉ có thể tìm thấy các mẫu văn bản mà còn có thể thay thế văn bản mới thay cho các mẫu đó. Phương thức sub[] cho các đối tượng Regex được truyền hai đối số. Đối số đầu tiên là một chuỗi để thay thế bất kỳ kết quả khớp nào. Thứ hai là chuỗi cho biểu thức chính quy. Phương thức sub[] trả về một chuỗi với các thay thế được áp dụng

Ví dụ: nhập thông tin sau vào trình bao tương tác

>>> tênRegex = lại. biên dịch [r'Agent \w+']
>>> tênRegex. sub['CENSORED', 'Đặc vụ Alice đưa tài liệu bí mật cho Đặc vụ Bob. ']
'CENSORED đưa tài liệu bí mật cho CENSORED. '

Đôi khi bạn có thể cần sử dụng chính văn bản phù hợp như một phần của thay thế. Trong đối số đầu tiên của sub[], bạn có thể nhập \1, \2, \3, v.v. để có nghĩa là “Nhập văn bản của nhóm 1, 2, 3, v.v. vào phần thay thế. ”

Ví dụ: giả sử bạn muốn kiểm duyệt tên của các mật vụ bằng cách chỉ hiển thị các chữ cái đầu tiên trong tên của họ. Để làm điều này, bạn có thể sử dụng regex Agent [\w]\w* và chuyển r'\1****' làm đối số đầu tiên cho sub[]. \1 trong chuỗi đó sẽ được thay thế bằng bất kỳ văn bản nào được khớp với nhóm 1—nghĩa là nhóm [\w] của biểu thức chính quy

>>> agentNamesRegex = lại. biên dịch[r'Agent [\w]\w*']
>>> agentNamesRegex. sub[r'\1****', 'Đặc vụ Alice nói với Đặc vụ Carol rằng Đặc vụ
Eve biết Đặc vụ Bob là điệp viên hai mang. ']
A**** nói với C**** rằng E**** biết B**** là điệp viên hai mang. '

Quản lý Regex phức tạp

Cụm từ thông dụng sẽ ổn nếu mẫu văn bản bạn cần khớp đơn giản. Nhưng việc khớp các mẫu văn bản phức tạp có thể yêu cầu các biểu thức chính quy dài và phức tạp. Bạn có thể giảm thiểu điều này bằng cách nói lại. compile[] để bỏ qua khoảng trắng và nhận xét bên trong chuỗi biểu thức chính quy. “Chế độ chi tiết” này có thể được kích hoạt bằng cách chuyển biến re. VERBOSE làm đối số thứ hai cho re. biên dịch[]

Bây giờ thay vì một biểu thức chính quy khó đọc như thế này

phoneRegex = lại. biên dịch [r'[[\d{3}. \[\d{3}\]]?[\s. -. \. ]?\d{3}[\s. -. \. ]\d{4}
[\s*[ext. x. mở rộng. ]\s*\d{2,5}]?]']

bạn có thể trải rộng biểu thức chính quy trên nhiều dòng với các nhận xét như thế này

phoneRegex = lại. biên dịch[r'''[
    [\d{3}. \[\d{3}\]]? . -. \. ]? . -. \. ]                     # dấu phân cách
    [\s|-|\.]?                    # separator
    \d{3}                         # first 3 digits
    [\s|-|\.]                     # separator
    \d{4}                         # 4 chữ số cuối
 [\s*[ext. x. mở rộng. ]\s*\d{2,5}]? . RÕ RÀNG]
    ]''', re.VERBOSE]

Lưu ý cách ví dụ trước sử dụng cú pháp trích dẫn ba lần ['''] để tạo chuỗi nhiều dòng sao cho bạn có thể trải rộng định nghĩa biểu thức chính quy trên nhiều dòng, làm cho nó dễ đọc hơn nhiều

Các quy tắc nhận xét bên trong chuỗi biểu thức chính quy giống như mã Python thông thường. biểu tượng # và mọi thứ sau nó đến cuối dòng đều bị bỏ qua. Ngoài ra, các khoảng trắng thừa bên trong chuỗi nhiều dòng cho biểu thức chính quy không được coi là một phần của mẫu văn bản được so khớp. Điều này cho phép bạn sắp xếp biểu thức chính quy để dễ đọc hơn

Kết hợp lại. BỎ QUA, lại. DOTALL, và lại. RÕ RÀNG

Nếu bạn muốn sử dụng lại. VERBOSE để viết nhận xét trong biểu thức chính quy của bạn nhưng cũng muốn sử dụng lại. IGNORECASE để bỏ qua viết hoa? . compile[] chỉ nhận một giá trị duy nhất làm đối số thứ hai của nó. Bạn có thể khắc phục hạn chế này bằng cách kết hợp các. BỎ QUA, lại. DOTALL, và lại. Biến VERBOSE sử dụng ký tự ống [. ], trong ngữ cảnh này được gọi là bitwise hoặc toán tử

Vì vậy, nếu bạn muốn một biểu thức chính quy không phân biệt chữ hoa chữ thường và bao gồm các dòng mới để khớp với ký tự dấu chấm, bạn sẽ tạo lại. compile[] gọi như thế này

>>> someRegexValue = lại. biên dịch ['foo', lại. BỎ QUA TRƯỜNG HỢP. lại. CHẤM]

Bao gồm cả ba tùy chọn trong đối số thứ hai sẽ trông như thế này

>>> someRegexValue = lại. biên dịch ['foo', lại. BỎ QUA TRƯỜNG HỢP. lại. CHẤM. lại. RÕ RÀNG]

Cú pháp này hơi lỗi thời và bắt nguồn từ các phiên bản đầu tiên của Python. Chi tiết về các toán tử bitwise nằm ngoài phạm vi của cuốn sách này, nhưng hãy xem các tài nguyên tại https. //Không có tinh bột. com/automatestuff2/ để biết thêm thông tin. Bạn cũng có thể chuyển các tùy chọn khác cho đối số thứ hai;

Dự án. Trình trích xuất số điện thoại và địa chỉ email

Giả sử bạn có nhiệm vụ nhàm chán là tìm mọi số điện thoại và địa chỉ email trong một trang web hoặc tài liệu dài. Nếu bạn cuộn trang theo cách thủ công, bạn có thể sẽ mất nhiều thời gian để tìm kiếm. Nhưng nếu bạn có một chương trình có thể tìm kiếm văn bản trong khay nhớ tạm để tìm số điện thoại và địa chỉ email, thì bạn chỉ cần nhấn CTRL-A để chọn tất cả văn bản, nhấn CTRL-C để sao chép nó vào khay nhớ tạm, rồi chạy chương trình của bạn. Nó có thể thay thế văn bản trên clipboard chỉ bằng số điện thoại và địa chỉ email mà nó tìm thấy

Bất cứ khi nào bạn giải quyết một dự án mới, bạn có thể bị cám dỗ ngay lập tức viết mã. Nhưng thường xuyên hơn không, tốt nhất là lùi lại một bước và xem xét bức tranh lớn hơn. Tôi khuyên bạn nên lập một kế hoạch cấp cao trước tiên cho những gì chương trình của bạn cần làm. Đừng nghĩ về mã thực tế - bạn có thể lo lắng về điều đó sau. Ngay bây giờ, hãy bám vào những nét rộng

Ví dụ: trình trích xuất địa chỉ email và điện thoại của bạn sẽ cần thực hiện các thao tác sau

  1. Lấy văn bản ra khỏi clipboard
  2. Tìm tất cả các số điện thoại và địa chỉ email trong văn bản
  3. Dán chúng vào khay nhớ tạm

Bây giờ bạn có thể bắt đầu suy nghĩ về cách điều này có thể hoạt động trong mã. Mã sẽ cần phải làm như sau

  1. Sử dụng mô-đun pyperclip để sao chép và dán chuỗi
  2. Tạo hai regex, một để khớp số điện thoại và cái còn lại để khớp địa chỉ email
  3. Tìm tất cả các kết quả khớp, không chỉ kết quả khớp đầu tiên, của cả hai biểu thức chính quy
  4. Định dạng gọn gàng các chuỗi phù hợp thành một chuỗi để dán
  5. Hiển thị một số loại thông báo nếu không tìm thấy kết quả phù hợp trong văn bản

Danh sách này giống như một bản đồ đường đi cho dự án. Khi bạn viết mã, bạn có thể tập trung vào từng bước này một cách riêng biệt. Mỗi bước khá dễ quản lý và được thể hiện dưới dạng những điều bạn đã biết cách thực hiện trong Python

Bước 1. Tạo Regex cho số điện thoại

Đầu tiên, bạn phải tạo một biểu thức chính quy để tìm kiếm số điện thoại. Tạo một tệp mới, nhập thông tin sau và lưu dưới dạng phoneAndEmail. py

#. python3
# phoneAndEmail. py - Tìm số điện thoại và địa chỉ email trên khay nhớ tạm.

nhập pyperclip, lại

phoneRegex = lại. biên dịch[r'''[
    [\d{3}. \[\d{3}\]]? . -. \. ]? . -. \. ]                          # dấu phân cách
    [\s|-|\.]?                        # separator
    [\d{3}]                           # first 3 digits
    [\s|-|\.]                         # separator
    [\d{4}]                           # 4 chữ số cuối
    [\s*[ext. x. mở rộng. ]\s*[\d{2,5}]]? . RÕ RÀNG]
    ]''', re.VERBOSE]

# LÀM. Tạo biểu thức chính quy email

# LÀM. Tìm kết quả phù hợp trong văn bản clipboard

# LÀM. Sao chép kết quả vào clipboard

Các chú thích TODO chỉ là phần khung của chương trình. Chúng sẽ được thay thế khi bạn viết mã thực tế

Số điện thoại bắt đầu bằng một mã vùng tùy chọn, do đó, nhóm mã vùng được theo sau bởi một dấu chấm hỏi. Vì mã vùng có thể chỉ gồm ba chữ số [nghĩa là \d{3}] hoặc ba chữ số trong dấu ngoặc đơn [nghĩa là \[\d{3}\]], bạn nên có một đường ống nối các phần đó. Bạn có thể thêm nhận xét regex # Mã vùng vào phần này của chuỗi nhiều dòng để giúp bạn nhớ nội dung [\d{3}. \[\d{3}\]]?

Ký tự tách số điện thoại có thể là dấu cách [\s], dấu gạch ngang [-] hoặc dấu chấm [. ], vì vậy các bộ phận này cũng nên được nối với nhau bằng các đường ống. Một số phần tiếp theo của biểu thức chính quy rất đơn giản. ba chữ số, tiếp theo là dấu phân cách khác, tiếp theo là bốn chữ số. Phần cuối cùng là phần mở rộng tùy chọn được tạo thành từ bất kỳ khoảng trắng nào theo sau bởi ext, x hoặc ext. , theo sau là hai đến năm chữ số

GHI CHÚ

Rất dễ nhầm lẫn với các biểu thức chính quy chứa các nhóm có dấu ngoặc đơn [ ] và dấu ngoặc đơn thoát \[ \]. Hãy nhớ kiểm tra kỹ xem bạn có đang sử dụng đúng mẫu không nếu bạn nhận được thông báo lỗi "mẫu phụ bị thiếu], chưa kết thúc"

Bước 2. Tạo Regex cho địa chỉ email

Bạn cũng sẽ cần một biểu thức chính quy có thể khớp với địa chỉ email. Làm cho chương trình của bạn trông giống như sau

#. python3
# phoneAndEmail. py - Tìm số điện thoại và địa chỉ email trên khay nhớ tạm.

nhập pyperclip, lại

phoneRegex = lại. biên dịch[r'''[
--snip--

# Tạo biểu thức chính quy email.
emailRegex = lại. biên dịch[r'''[
  ➊ [a-zA-Z0-9. _%+-]+      # tên người dùng
  ➋ @                      # @ ký hiệu
  ➌ [a-zA-Z0-9. -]+         # tên miền
    [\. [a-zA-Z]{2,4}]       # dot-something
    ]''', lại. RÕ RÀNG]

# LÀM. Tìm kết quả phù hợp trong văn bản clipboard

# LÀM. Sao chép kết quả vào clipboard

Phần tên người dùng của địa chỉ email ➊ là một hoặc nhiều ký tự có thể là bất kỳ ký tự nào sau đây. chữ thường và chữ hoa, số, dấu chấm, dấu gạch dưới, dấu phần trăm, dấu cộng hoặc dấu gạch nối. Bạn có thể đặt tất cả những thứ này vào một lớp ký tự. [a-zA-Z0-9. _%+-]

Tên miền và tên người dùng được phân tách bằng ký hiệu @ ➋. Tên miền ➌ có lớp ký tự ít cho phép hơn một chút chỉ có các chữ cái, số, dấu chấm và dấu gạch nối. [a-zA-Z0-9. -]. Và cuối cùng sẽ là phần “dot-com” [về mặt kỹ thuật được gọi là tên miền cấp cao nhất], phần này thực sự có thể là dot-anything. Đây là từ hai đến bốn ký tự

Định dạng cho địa chỉ email có nhiều quy tắc kỳ lạ. Biểu thức chính quy này sẽ không khớp với mọi địa chỉ email hợp lệ có thể, nhưng nó sẽ khớp với hầu hết mọi địa chỉ email điển hình mà bạn sẽ gặp

Bước 3. Tìm tất cả các kết quả phù hợp trong văn bản Clipboard

Bây giờ bạn đã chỉ định các biểu thức chính quy cho số điện thoại và địa chỉ email, bạn có thể để mô-đun re của Python thực hiện công việc khó khăn là tìm tất cả các kết quả phù hợp trên khay nhớ tạm. cái kẹp pyper. hàm paste[] sẽ nhận một giá trị chuỗi của văn bản trên khay nhớ tạm và phương thức biểu thức chính quy findall[] sẽ trả về một danh sách các bộ dữ liệu

Làm cho chương trình của bạn trông giống như sau

   #. python3
   # phoneAndEmail. py - Tìm số điện thoại và địa chỉ email trên khay nhớ tạm.

nhập pyperclip, lại

   phoneRegex = re. biên dịch[r'''[
   --snip--

   # Tìm kết quả khớp trong văn bản khay nhớ tạm.
   text = str[pyperclip. dán[]]

➊ Match = []
➋ cho các nhóm trong phoneRegex. tìm tất cả [văn bản].
       phoneNum = '-'. tham gia[[nhóm[1], nhóm[3], nhóm[5]]]
       nếu nhóm[8]. = ''.
           phoneNum += ' x' + groups[8]
       matches. append[phoneNum]
➌ cho các nhóm trong emailRegex. tìm tất cả [văn bản].
       trận đấu. chắp thêm[nhóm[0]]

# LÀM. Sao chép kết quả vào clipboard

Có một bộ cho mỗi trận đấu và mỗi bộ chứa các chuỗi cho mỗi nhóm trong biểu thức chính quy. Hãy nhớ rằng nhóm 0 khớp với toàn bộ biểu thức chính quy, vì vậy nhóm ở chỉ mục 0 của bộ dữ liệu là nhóm bạn quan tâm

Như bạn có thể thấy ở ➊, bạn sẽ lưu trữ các trận đấu trong một biến danh sách có tên là trận đấu. Nó bắt đầu dưới dạng một danh sách trống và một vài vòng lặp for. Đối với các địa chỉ email, bạn nối thêm nhóm 0 của mỗi trận đấu ➌. Đối với các số điện thoại phù hợp, bạn không muốn chỉ thêm nhóm 0. Mặc dù chương trình phát hiện các số điện thoại ở một số định dạng, nhưng bạn muốn số điện thoại được thêm vào ở một định dạng chuẩn duy nhất. Biến phoneNum chứa một chuỗi được tạo từ các nhóm 1, 3, 5 và 8 của văn bản khớp ➋. [Các nhóm này là mã vùng, ba chữ số đầu tiên, bốn chữ số cuối cùng và phần mở rộng. ]

Bước 4. Tham gia các trận đấu thành một chuỗi cho Clipboard

Bây giờ bạn đã có địa chỉ email và số điện thoại dưới dạng danh sách các chuỗi khớp, bạn muốn đặt chúng vào khay nhớ tạm. cái kẹp pyper. copy[] chỉ nhận một giá trị chuỗi duy nhất, không phải danh sách các chuỗi, vì vậy bạn gọi phương thức join[] trên các kết quả khớp

Để dễ dàng thấy rằng chương trình đang hoạt động, hãy in bất kỳ kết quả phù hợp nào bạn tìm thấy vào thiết bị đầu cuối. Nếu không tìm thấy số điện thoại hoặc địa chỉ email, chương trình sẽ cho người dùng biết điều này

Làm cho chương trình của bạn trông giống như sau

#. python3
# phoneAndEmail. py - Tìm số điện thoại và địa chỉ email trên khay nhớ tạm.

--snip--
cho các nhóm trong emailRegex. tìm tất cả [văn bản].
    trận đấu. chắp thêm[nhóm[0]]

# Sao chép kết quả vào khay nhớ tạm.
if len[matches] > 0.
    pyperclip. sao chép['\n'. tham gia [trận đấu]]
    print['Đã sao chép vào khay nhớ tạm. ']
    print['\n'. tham gia [trận đấu]]
else.
    print['Không tìm thấy số điện thoại hoặc địa chỉ email nào. ']

Chạy chương trình

Ví dụ: mở trình duyệt web của bạn tới trang liên hệ của No Starch Press tại https. //Không có tinh bột. com/contactus/, nhấn CTRL-A để chọn tất cả văn bản trên trang và nhấn CTRL-C để sao chép văn bản đó vào khay nhớ tạm. Khi bạn chạy chương trình này, đầu ra sẽ giống như thế này

Đã sao chép vào khay nhớ tạm.
800-420-7240
415-863-9900
415-863-9950
info@nostarch.com
media@nostarch. com
academic@nostarch. com
info@nostarch. com

Ý tưởng cho các chương trình tương tự

Việc xác định các mẫu văn bản [và có thể thay thế chúng bằng phương thức sub[]] có nhiều ứng dụng tiềm năng khác nhau. Ví dụ, bạn có thể

  • Tìm URL trang web bắt đầu bằng http. // hoặc https. //
  • Xóa ngày ở các định dạng ngày khác nhau [chẳng hạn như 14/3/2019, 14/03/2019 và 2015/03/19] bằng cách thay thế chúng bằng các ngày ở một định dạng chuẩn duy nhất
  • Xóa thông tin nhạy cảm như số An sinh xã hội hoặc số thẻ tín dụng
  • Tìm các lỗi chính tả phổ biến như nhiều khoảng cách giữa các từ, vô tình lặp lại các từ vô tình hoặc nhiều dấu chấm than ở cuối câu. Đó là những khó chịu

Bản tóm tắt

Mặc dù máy tính có thể tìm kiếm văn bản một cách nhanh chóng, nhưng nó phải được cho biết chính xác nội dung cần tìm. Cụm từ thông dụng cho phép bạn chỉ định mẫu ký tự mà bạn đang tìm kiếm, thay vì chính văn bản chính xác. Trên thực tế, một số ứng dụng xử lý văn bản và bảng tính cung cấp các tính năng tìm và thay thế cho phép bạn tìm kiếm bằng các biểu thức thông thường

Mô-đun re đi kèm với Python cho phép bạn biên dịch các đối tượng Regex. Các đối tượng này có một số phương thức. search[] để tìm một kết quả phù hợp, findall[] để tìm tất cả các trường hợp phù hợp và sub[] để thực hiện tìm và thay thế văn bản

Bạn có thể tìm hiểu thêm trong tài liệu Python chính thức tại https. // tài liệu. con trăn. org/3/library/re. html. Một tài nguyên hữu ích khác là trang web hướng dẫn https. //www. biểu thức chính quy. thông tin/

câu hỏi thực hành

1. Hàm tạo đối tượng Regex là gì?

2. Tại sao chuỗi thô thường được sử dụng khi tạo đối tượng Regex?

3. Phương thức search[] trả về cái gì?

4. Làm cách nào để bạn có được các chuỗi thực khớp với mẫu từ một đối tượng Match?

5. Trong biểu thức chính quy được tạo từ r'[\d\d\d]-[\d\d\d-\d\d\d\d]', nhóm 0 bao gồm những gì?

6. Dấu ngoặc đơn và dấu chấm có ý nghĩa cụ thể trong cú pháp biểu thức chính quy. Làm cách nào bạn chỉ định rằng bạn muốn biểu thức chính quy khớp với dấu ngoặc đơn và ký tự dấu chấm thực tế?

7. Phương thức findall[] trả về một danh sách các chuỗi hoặc một danh sách các bộ chuỗi. Điều gì làm cho nó trở lại cái này hay cái kia?

8. những gì làm. ký tự biểu thị trong biểu thức chính quy?

9. Hai điều gì làm ?

10. Sự khác biệt giữa các ký tự + và * trong biểu thức chính quy là gì?

11. Sự khác biệt giữa {3} và {3,5} trong các biểu thức chính quy là gì?

12. Các lớp ký tự tốc ký \d, \w, và \s biểu thị điều gì trong các biểu thức chính quy?

13. Các lớp ký tự tốc ký \D, \W và \S biểu thị điều gì trong các biểu thức chính quy?

14. Đâu là sự khác biệt giữa. * và. *??

15. Cú pháp lớp ký tự để khớp với tất cả các số và chữ thường là gì?

16. Làm thế nào để bạn tạo một biểu thức chính quy không phân biệt chữ hoa chữ thường?

17. những gì làm. nhân vật bình thường phù hợp? . DOTALL được chuyển thành đối số thứ hai cho re. biên dịch[]?

18. Nếu numRegex = lại. biên dịch [r'\d+'], numRegex sẽ như thế nào. sub['X', '12 tay trống, 11 người thổi sáo, 5 chiếc nhẫn, 3 con gà mái'] trả về?

19. có nghĩa là gì đi qua lại. VERBOSE làm đối số thứ hai cho re. compile[] cho phép bạn làm gì?

20. Bạn sẽ viết một biểu thức chính quy khớp với một số bằng dấu phẩy cho mỗi ba chữ số như thế nào?

nhưng không phải như sau

  • '12,34,567' [chỉ có hai chữ số giữa các dấu phẩy]
  • '1234' [thiếu dấu phẩy]

21. Bạn sẽ viết một biểu thức chính quy khớp với tên đầy đủ của một người có họ là Watanabe như thế nào? . Regex phải phù hợp với những điều sau đây

  • 'Haruto Watanabe'
  • 'Alice Watanabe'
  • 'RoboCop Watanabe'

nhưng không phải như sau

  • 'haruto Watanabe' [tên riêng không viết hoa]
  • 'Ông. Watanabe' [trong đó từ đứng trước có ký tự không phải chữ cái]
  • 'Watanabe' [không có tên]
  • 'Haruto watanabe' [nơi Watanabe không được viết hoa]

22. Làm cách nào để bạn viết một biểu thức chính quy khớp với một câu trong đó từ đầu tiên là Alice, Bob hoặc Carol; . Nó phải phù hợp với những điều sau đây

  • 'Alice ăn táo. '
  • 'Bob nuôi mèo. '
  • 'Carol ném bóng chày. '
  • 'Alice ném táo. '
  • 'BOB ĂN MÈO. '

nhưng không phải như sau

  • 'RoboCop ăn táo. '
  • 'ALICE NÉM BÓNG. '
  • 'Carol ăn 7 con mèo. '

Dự án thực hành

Để thực hành, hãy viết chương trình để thực hiện các nhiệm vụ sau

Phát hiện ngày

Viết biểu thức chính quy có thể phát hiện ngày ở định dạng DD/MM/YYYY. Giả sử rằng các ngày nằm trong khoảng từ 01 đến 31, các tháng nằm trong khoảng từ 01 đến 12 và các năm nằm trong khoảng từ 1000 đến 2999. Lưu ý rằng nếu ngày hoặc tháng là một chữ số, nó sẽ có số 0 ở đầu

Biểu thức chính quy không cần phải phát hiện ngày chính xác cho mỗi tháng hoặc cho năm nhuận; . Sau đó, lưu trữ các chuỗi này vào các biến có tên tháng, ngày và năm và viết mã bổ sung có thể phát hiện xem đó có phải là ngày hợp lệ hay không. Tháng 4, 6, 9, 11 có 30 ngày, tháng 2 có 28 ngày, các tháng còn lại có 31 ngày. Tháng 2 có 29 ngày trong năm nhuận. Năm nhuận là năm nào cũng chia hết cho 4, trừ năm chia hết cho 100, trừ năm cũng chia hết cho 400. Lưu ý cách tính toán này khiến không thể tạo biểu thức chính quy có kích thước hợp lý có thể phát hiện ngày hợp lệ

Phát hiện mật khẩu mạnh

Viết hàm sử dụng biểu thức chính quy để đảm bảo chuỗi mật khẩu được truyền là mạnh. Mật khẩu mạnh được định nghĩa là mật khẩu dài ít nhất tám ký tự, chứa cả ký tự viết hoa và viết thường và có ít nhất một chữ số. Bạn có thể cần kiểm tra chuỗi dựa trên nhiều mẫu biểu thức chính quy để xác thực độ mạnh của nó

Phiên bản Regex của Phương thức dải[]

Viết một hàm nhận vào một chuỗi và thực hiện tương tự như phương thức chuỗi strip[]. Nếu không có đối số nào khác được truyền ngoài chuỗi để tách, thì các ký tự khoảng trắng sẽ bị xóa khỏi đầu và cuối chuỗi. Nếu không, các ký tự được chỉ định trong đối số thứ hai của hàm sẽ bị xóa khỏi chuỗi

Chủ Đề