регулярное выражение python работает с числами, а не с буквами? - PullRequest
0 голосов
/ 22 мая 2018

Я натягиваю свои волосы на это ... предположим, у меня есть следующая строка: "123abc" и я хочу пересмотреть ее в python 2.7.Если я сделаю:

import re
s = "123abc"
m = re.search('[0-9]*', s)
print(m.group(0))

, он будет вести себя точно так, как ожидается, выдает «123».

ОДНАКО, если я вместо этого хочу сделать:

import re
s = "123abc"
m = re.search('[a-z]*', s)
print(m.group(0))

, он просто печатает"" -> пустая строка.

Почему?Как мне заставить его работать с персонажами?

Также обратите внимание, что если я уберу звездочку, она будет работать с буквами (например, group(0) - a).И да, я тоже пробовал r'[a-z]*';это тоже не исправит.

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Это самое простое исправление для получения желаемого результата

import re
s = "123abc"
m = re.search('[a-z]+', s)
print(m.group(0))

Это также работает для вашего исходного числового регулярного выражения и выводит '123', если вы просто замените разделитель.+ соответствует 1 или более, что больше соответствует желаемому.

0 голосов
/ 22 мая 2018

Чтобы увидеть разницу в поведении, давайте посмотрим вывод findall для обоих регулярных выражений:

>>> print re.findall('[a-z]*', s)
['', '', '', 'abc', '']

>>> print re.findall('[0-9]*', s)
['123', '', '', '', '']

Как вы можете видеть с [a-z]*, мы получаем 3 пустых соответствия перед соответствием abc, то естьпричина search возвращает пустое значение, поскольку возвращает первое совпадение.

Вы используете [a-z]* (0 или более вхождений [a-z]), оно соответствует даже пустой строке.Таким образом, мы получаем 3 пустых совпадения для первых 3 букв 1, 2, 3 и еще одно пустое совпадение в конце строки.

Однако для второго случая, поскольку первое совпадение равно 123, мы получаемТо же самое возвращается функцией search.

Когда мы используем +, поведение квантификатора меняется на следующее:

>>> print re.findall('[0-9]+', s)
['123']
>>> print re.findall('[a-z]+', s)
['abc']

, возвращая нам одинаковое совпадение для обоих регулярных выражений, поскольку пустые совпадения невозможныТеперь.

0 голосов
/ 22 мая 2018

* соответствует нулю или более раз.Подумайте о позиции непосредственно перед первым символом в «113abc», который сейчас равен нулю!Так совпало.

...