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

Tại sao dùng dấu hỏi (?) trong Python Regular Expression

Dấu hỏi ? trong regex có 3 ý nghĩa khác nhau tùy ngữ cảnh.

1. Quantifier: 0 hoặc 1 lần (Optional)

Áp dụng cho element ngay trước nó.


import re

# 'ab?c' khớp 'ac' (b: 0 lần) hoặc 'abc' (b: 1 lần)
print(bool(re.match(r'ab?c', 'ac')))   # True
print(bool(re.match(r'ab?c', 'abc')))  # True
print(bool(re.match(r'ab?c', 'abbc'))) # False

2. Non-greedy Modifier: Làm quantifier trở thành "lười biếng"

Đặt sau *, +, ?, {m,n} để match ít nhất có thể.


text = 'content1content2'

# Greedy (mặc định): match nhiều nhất có thể
print(re.findall(r'.*', text))
# ['content1content2']

# Non-greedy (lazy): match ít nhất có thể
print(re.findall(r'.*?', text))
# ['content1', 'content2']

3. Group Syntax Extensions (trong ngoặc)

SyntaxTênChức năng
(?:...)Non-capturing groupGroup không capture
(?=...)Positive lookaheadAssert tiếp theo khớp...
(?!...)Negative lookaheadAssert tiếp theo KHÔNG khớp...
(?<=...)Positive lookbehindAssert trước đó khớp...
(?Negative lookbehindAssert trước đó KHÔNG khớp...
(?P...)Named groupĐặt tên group
(?P=name)Named backreferenceTham chiếu named group
(?(id/name)yes|no)ConditionalIf group matched thì yes else no
(?#...)CommentComment trong pattern
(?imsx)Inline flagsBật/tắt flags cục bộ

Tóm tắt 3 vai trò của ?

  1. Quantifier: a? - 'a' xuất hiện 0 hoặc 1 lần.
  2. Non-greedy modifier: .*?, .+?, {2,5}? - match tối thiểu.
  3. Group syntax marker: (?... - bắt đầu special group (lookahead, named, non-capturing...).