почему python возвращает следующее? - PullRequest
3 голосов
/ 23 сентября 2019
p = re.compile('x*')
print(p.search('abxd'))

вывод:

<re.Match object; span=(0, 0), match=''>
p = re.compile('x+')
print(p.search('abxd'))

вывод:

<re.Match object; span=(2, 3), match='x'>

Ответы [ 2 ]

3 голосов
/ 23 сентября 2019

То, что вы видите, это Python (точнее, модуль Regex), возвращающий объект re.Mach .Этот объект имеет методы и классы, которые вы можете вызывать для получения желаемых результатов.

Например, если вы просто хотите найти совпадение в виде строки, этот код напечатает его:

>>> expression = re.compile('.+')
>>> result = expression.search('abcd')
>>> print(result.group())
'abcd'

Ваш текущий код (первый пример) также содержит выражение, которое не соответствуетвходная строка, которая может быть источником некоторой путаницы.В приведенном мною примере я использовал .+, что соответствует любому символу от нуля до бесконечности. Regex101.com делает прекрасную работу, помогая создавать выражения Regex и понимая синтаксис.

Вот документация для объекта Regex Match (что вы получаете в своем текущем коде), и, в частности, здесь это документация для .group() метод.

Краткое примечание:

Вам не нужно составлять выражения перед вызовом функции поиска (однако это полностью личное предпочтение, но чащеиспользуется; есть веские причины для компиляции выражения перед вызовом функции поиска, но это выходит за рамки ответа на этот вопрос).Два следующих кодовых блока будут выполнять одно и то же:

expression = re.compile('.+')
print(expression.search('string'))
print(re.search(r'.+', 'string'))

Во втором блоке выражение является первым параметром в функции поиска, с r перед ним,указывая, что это выражение регулярного выражения.

Надеюсь, это поможет!

2 голосов
/ 23 сентября 2019

Как документы для re.search () говорят:

Просматривать строку в поисках местоположения first , где шаблон регулярного выражения создаетсопоставить и вернуть соответствующий объект сопоставления.Вернуть None, если ни одна позиция в строке не соответствует шаблону;обратите внимание, что это отличается от поиска совпадения нулевой длины в некоторой точке строки.

(выделено мной)

Ваш первый RegEx x* соответствует нулю илибольше символа x.Из всех матчей возвращается первый.Ваш шаблон соответствует началу вашей строки, потому что это zero 'x's.Следовательно, ваше совпадение начинается и заканчивается в позиции 0 (<re.Match object; span=(0, 0), match=''>).

При поиске x+ это означает один или несколько символов x.Единственное x в вашей строке находится в позиции 2 (третий символ, но мы начинаем считать с 0).Это один символ в длину, поэтому он заканчивается на позиции 3. Следовательно, ваш результат <re.Match object; span=(2, 3), match='x'>.

Если вы посмотрели все матчи, а не только первый, вы бы увидели и другие матчи!Вы можете сделать это, например, используя re.findall ()

Пример:

>>> re.findall(r'x+', 'abxb')
['x']
>>> re.findall(r'x*', 'abxb')
['', '', 'x', '', '']

Как видите, совпадение ноль или более означает, что мы сопоставляем все несуществующие символы между нашими буквами тоже!Эта функция, равная нулю или более, гораздо полезнее в сочетании с другими шаблонами, т. Е. Если мы хотим сказать, что символ или слово необязательно в нашем сопоставлении.Допустим, мы хотели сопоставить все b с, за которыми следует ноль или более x es:

>>> re.findall(r'bx*', 'abxb')
['bx', 'b']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...