Top.Mail.Ru
Ответы
Аватар пользователя
8мес
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+2

Python регулярные выражения. что такое r, rf, f вот в таком контексте:

nn = r'[1-9]\d*'
zn = rf'(?:{nn}\*|0\*)*0(?:\*{nn}|\*0)*'
sum_prod = rf'{zn}(?:\+{zn})*'
arr = re.findall(f'{sum_prod}', s)

По дате
По рейтингу
Аватар пользователя
Новичок
8мес

В Python префикс r перед запись строки (любой строки, а не только регулярного выражения) означает, что символ \ в этой строке записывает сам символ \, а не является началом специальной последовательности:
'\n' - один символ перевода строки
r'\n' - строка из двух символов: \ и n
'\\' - один символ: \
r'\\' - строка из двух символов: \ и \

Если бы не было r, первый пример пришлось бы записать так:
nn = '[1-9]\\d*'

Префикс f перед записью строки (опять же, любой, а не только регулярки) означает, что внутри строки в фигурных скобках находятся выражения, значения которых будут подставлены в строку в момент её создания.

Т.е. если у нас:
zn = 35
sum_prod = f'{zn}(?:\\+{zn})*'
, то значением переменной sum_prod будет: 35(?:\+35)*

Префиксы rf или fr задают одновременное использование обоих правил.

Аватар пользователя
Мудрец
8мес

1. **`r`-строки (raw-строки):** Префикс `r` перед строкой означает, что это "сырая" строка (raw string). В таких строках символы, обычно интерпретируемые как экранирующие, такие как `\`, остаются такими, какие они есть, и не обрабатываются как спецсимволы. Это удобно для регулярных выражений, где часто используются обратные слэши. Пример: `r'\n'` будет интерпретироваться как два символа `\` и `n`, а не как символ новой строки.

2. **`f`-строки (форматированные строки):** Префикс `f` перед строкой указывает, что это форматированная строка. В таких строках можно вставлять значения переменных или выражений, заключив их в фигурные скобки `{}`. Например, если `x = 10`, то `f'x is {x}'` будет преобразовано в строку `'x is 10'`.

3. **`rf`-строки (комбинация raw и форматированных строк):** Префикс `rf` объединяет свойства как raw, так и форматированных строк. Это позволяет использовать как "сырые" символы, так и подставлять значения переменных. Например, в `rf'Value: {value}\n'`, будет подставлено значение переменной `value`, а `\n` останется как два отдельных символа.

Таким образом, в вашем коде:

- `nn = r'[1-9]\d*'` определяет шаблон регулярного выражения для положительных целых чисел, исключая ноль.
- `zn = rf'(?:{nn}\*|0\*)*0(?:\*{nn}|\*0)*'` использует `nn` внутри еще одного регулярного выражения, где `rf` позволяет подставить значение `nn` в составное регулярное выражение.
- `sum_prod = rf'{zn}(?:\+{zn})*'` формирует шаблон для поиска нужного вам выражения, подставляя `zn`.
- `arr = re.findall(f'{sum_prod}', s)` ищет все вхождения, соответствующие `sum_prod`, в строке `s`, используя форматированную строку `f`, чтобы подставить значение `sum_prod`.