Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Khác biệt giữa . ? * trong Python Regular Expression

Ba metacharacter quan trọng nhất cho quantifier và wildcard.

1. Dấu chấm . - Wildcard

  • Khớp bất kỳ ký tự đơn nào TRỪ newline (\n).
  • Với flag re.DOTALL (hoặc re.S): khớp cả newline.
  • Không phải quantifier - nó là atom (đơn vị khớp cơ bản).

re.match(r'a.c', 'abc')   # Match
re.match(r'a.c', 'a\nc')  # No match (mặc định)
re.match(r'a.c', 'a\nc', re.DOTALL)  # Match

2. Dấu hỏi ? - Quantifier (0 hoặc 1)

  • Làm cho element trước nó trở thành optional (khớp 0 hoặc 1 lần).
  • Element có thể là: literal, character class, group, v.v.

re.match(r'ab?c', 'ac')    # Match (b xuất hiện 0 lần)
re.match(r'ab?c', 'abc')   # Match (b xuất hiện 1 lần)
re.match(r'ab?c', 'abbc')  # No match (b xuất hiện 2 lần)

3. Asterisk * - Quantifier (0 hoặc nhiều)

  • Khớp element trước nó 0, 1, 2, ... lần (bao nhiêu càng tốt - greedy).

re.match(r'ab*c', 'ac')    # Match (b: 0 lần)
re.match(r'ab*c', 'abc')   # Match (b: 1 lần)
re.match(r'ab*c', 'abbbc') # Match (b: 3 lần)

So sánh tóm tắt

Ký tựLoạiSố lần khớpVí dụ patternKhớp
.Atom (wildcard)Chính xác 1a.cabc, axc, a.c
?Quantifier0 hoặc 1ab?cac, abc
*Quantifier0, 1, 2, ...ab*cac, abc, abbc, abbbc...
+Quantifier1, 2, 3, ...ab+cabc, abbc, abbbc... (KHÔNG khớp ac)

Non-greedy variants

  • *?: 0 hoặc nhiều, ít nhất có thể (lazy).
  • +?: 1 hoặc nhiều, ít nhất có thể.
  • ??: 0 hoặc 1, ưu tiên 0.

text = 'content'

re.findall(r'.*', text)   # ['content'] - greedy
re.findall(r'.*?', text)  # ['content'] - lazy (cùng kết quả ở đây)

text2 = '12'
re.findall(r'.*', text2)   # ['12'] - greedy ăn hết
re.findall(r'.*?', text2)  # ['1', '2'] - lazy đúng