Квантор *
всегда применяется к объекту, после которого он помещается; <regex thing>*
означает, что <regex thing>
должен совпадать ноль или более раз.
Для вашей попытки <regex thing>
- это символ =
, поэтому =*
означает: ноль или более равных символов. И действительно, 'CThru='
содержит один такой равный символ, и не более. *
больше не будет соответствовать никому! Это отличается от glob синтаксиса , обычно используемого при перечислении файлов, где просто символ *
сам по себе используется для соответствия нулю или более символов имени файла . Регулярные выражения не являются шаблонами глобуса.
Если вы хотите получить значение , следующее за символом =
, вам нужно вставить шаблон (регулярное выражение), чтобы он соответствовал символам в тексте значения . Поскольку значения всегда являются символами , а не пробелами (пробел разделяет пары ключ = значение), вы можете использовать [^ ]
, чтобы сказать , а не пробел и добавить +
чтобы убедиться, что есть хотя бы один символ. [^...]
является отрицательным набором , регулярным выражением 'вещь', которое будет соответствовать любому символу в тексте, который не в наборе, поэтому [^ ]
соответствует любому символу, который является не пространство Квантор +
означает один или более символов, поэтому мы хотим, чтобы 1 или более символов не были пробелами. *
и +
являются жадными , что означает, что сопоставитель регулярных выражений будет использовать столько символов, сколько потребуется для удовлетворения этого шаблона.
Если вы поместите (...)
скобки вокруг этой части, вы скажете механизму регулярных выражений захватить эту часть и поместить ее в группу, и re.findall()
вернет все в группе 1, если есть только эта группа. Так что только значения после CThru=
возвращаются:
re.findall("CThru=([^ ]+)", test)
Это вернет любой текст, который не является пробелами , в виде списка:
>>> import re
>>> test = 'INFO: 106.00s - SearchDriver: GET CThru=27.027 OThru=25.566 CErr=0.000 CResp=0.013 OResp=0.011 CSD=0.015 OSD=0.010 C90%Resp=0.025 O90%Resp=0.025'
>>> re.findall("CThru=([^ ]+)", test)
['27.027']
Если такая пара ключ-значение будет одна , вы также можете использовать re.search()
и запросить группу 1, если это даст вам результат, который не None
:
match = re.search("CThru=([^ ]+)", test)
if match:
value = match.group(1)