В этом уроке вы узнаете, как использовать квантификаторы регулярных выражений в Python, чтобы определить, сколько раз может повторяться символ или набор символов.
Что такое квантификаторы регулярных выражений в Python?
В регулярных выражениях квантификаторы соответствуют предыдущим символам или наборам символов несколько раз. В следующей таблице показаны все квантификаторы и их значения:
| Квантификатор | Имя | Значение |
|---|---|---|
| * | Звездочка | Сопоставляет предыдущий элемент ноль или более раз. |
| + | Плюс | Сопоставляет предыдущий элемент один или несколько раз. |
| ? | Вопросительный знак | Сопоставит предшествующий элемент ноль или один раз. |
| { n } | Фигурные скобки | Сопоставит предыдущий элемент ровно n раз. |
| { n ,} | Фигурные скобки | Сопоставление предыдущего элемента не менее n раз. |
| { n , m } | Фигурные скобки | Сопоставление предшествующего элемента от n до m раз. |
Совпадение ноль или более раз (*)
Квантификатор(*) соответствует своему предыдущему элементу ноль или более раз. Например, следующая программа использует квантификатор * для сопоставления любой строки, оканчивающейся на Python:
import re
s = """CPython, IronPython, and JPython
are major Python's implementation"""
matches = re.finditer('\w*Python', s)
for match in matches:
print(match)
В этом примере:
- \w соответствует любому символу одного слова.
- Таким образом, \w* соответствует нулю или более символам слова.
- Таким образом, \w*Python соответствует любому нулю или более символам, за которыми следует строка Python.
В результате шаблон \w*Python соответствует CPython, IronPython, JPython и Python в строке:
<re.Match object; span=(0, 7), match="CPython"> <re.Match object; span=(9, 19), match="IronPython"> <re.Match object; span=(25, 32), match="JPython"> <re.Match object; span=(51, 57), match="Python">
Совпадение один или несколько раз (+)
Квантификатор + соответствует своему предыдущему элементу один или несколько раз. Например, \d+ соответствует одной или нескольким цифрам.
В следующем примере квантификатор + используется для сопоставления одной или нескольких цифр в строке:
import re
s = "Python 3.10 was released in 2021"
matches = re.finditer('\d+', s)
for match in matches:
print(match)
Выход:
<re.Match object; span=(7, 8), match="3"> <re.Match object; span=(9, 11), match="10"> <re.Match object; span=(28, 32), match="2021">
Совпадение ноль или один раз (?)
Квантификатор ? соответствует своему предыдущему элементу ноль или один раз.
В следующем примере квантификатор(?) используется для сопоставления color и colour:
import re
s = "What color / colour do you like?"
matches = re.finditer('colou?r', s)
for match in matches:
print(match)
Выход:
<re.Match object; span=(5, 10), match="color"> <re.Match object; span=(13, 19), match="colour">
В этом примере u? соответствует нулю или одному символу u. Таким образом, colou?r соответствует как color, так и colour.
Соответствие ровно n раз: {n}
Квантификатор {n} соответствует своему предыдущему элементу ровно n раз, где n равно нулю или положительному целому числу.
Например, следующая программа использует квантификатор {n} для сопоставления строки времени в формате чч:мм:
import re
s = "It was 11:05 AM"
matches = re.finditer('\d{2}:\d{2}', s)
for match in matches:
print(match)
Выход:
<re.Match object; span=(7, 12), match="11:05">
В этом примере \d{2} соответствует ровно двум цифрам. Таким образом, \d{2}:\d{2} соответствует строке, которая начинается с двух цифр(двоеточие 🙂 и заканчивается двумя цифрами.
Соответствие не менее n раз: {n,}
Квантификатор {n,} соответствует своему предыдущему элементу как минимум n раз, где n равно нулю или положительному целому числу.
Например, следующая программа использует квантификатор {n, } для сопоставления строк даты в формате мд-гггг или мм-дд-гггг:
import re
s = "5-5-2021 or 05-05-2021 or 5/5/2021"
matches = re.finditer('\d{1,}-\d{1,}-\d{4}', s)
for match in matches:
print(match)
Выход:
<re.Match object; span=(0, 8), match="5-5-2021"> <re.Match object; span=(12, 22), match="05-05-2021">
Соответствие n и m раз: {n,m}
Квантификатор {n,m} соответствует своему предыдущему элементу не менее n раз, но не более m раз, где n и m равны нулю или положительному целому числу. Например:
import re
s = "5-5-2021 or 05-05-2021 or 5/5/2021"
matches = re.finditer('\d{1,2}-\d{1,2}-\d{4}', s)
for match in matches:
print(match)
Выход:
<re.Match object; span=(0, 8), match="5-5-2021"> <re.Match object; span=(12, 22), match="05-05-2021">
В этом примере шаблон \d{1,2} соответствует одной или двум цифрам. Таким образом, шаблон \d{1,2}-\d{1,2}-\d{4} соответствует строке даты в формате дм-гггг или дд-мм-гггг.
