странное выходное регулярное выражение r '[-. \: alnum:] (. *)' - PullRequest
0 голосов
/ 19 февраля 2019

Я ожидаю получить все буквенно-цифровые символы после "-". Например:

>>> str1 = "12 - mystr"
>>> re.findall(r'[-.\:alnum:](.*)',  str1)
[' mystr']

Во-первых, странно, что пробел считается буквенно-цифровым, а я ожидал получить ['mystr'].

Во-вторых, я не могу понять, почему это можно получить, если нет "-":

>>> str2 = "qwertyuio"
>>> re.findall(r'[-.\:alnum:](.*)',  str2)
['io']

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Ваше регулярное выражение говорит: «Найдите любого из символов -.:alnum, затем запишите любое количество любых символов в первую группу захвата».

В первом тесте было найдено - дляпервый персонаж, затем захваченный mystr в первой группе захвата.Если в регулярном выражении есть какие-либо группы, findall возвращает список найденных групп, а не совпадений, поэтому соответствующее - не включается.

Ваш второй тест обнаружил u как один из -.:alnum символов (поскольку ни один из qwerty не соответствует ни одному), затем захватывается и возвращает остаток после него, io.

Как отмечает @revo в комментариях, [....] - это класс символов, соответствующий любомухарактер в этом.Чтобы включить в него класс символов POSIX (например, [:alnum:]), вам нужно два набора скобок.Кроме того, нет порядка в классе персонажа;тот факт, что вы включили в него -, означает, что это будет один из сопоставляемых символов, , а не , что буквенно-цифровые символы будут сопоставлены без него.Наконец, если вы хотите сопоставить любое количество буквенно-цифровых символов, у вас есть квантификатор * на неправильной вещи.

Таким образом, "соответствует -, тогда любое количество буквенно-цифровых символов" будет равно -([[:alnum:]]*), кроме ... Python не поддерживает классы символов POSIX .Таким образом, вы должны написать свое собственное: -([A-Za-z0-9]*).

Однако, это не будет соответствовать вашей строке, потому что промежуточный пробел, как вы заметили, не буквенно-цифровой символ.Чтобы учесть это, -\s*([A-Za-z0-9]*).

0 голосов
/ 19 февраля 2019

Не совсем уверен, что вы хотите соответствовать.Я предполагаю, что вы не хотите включать «-» в любых матчах.

Если вы хотите получить все буквенно-цифровые символы после первого '-' и пропустить все другие символы, вы можете сделать что-то вроде этого.

re.match('.*?(?<=-)(((?<=\s+)?[a-zA-Z\d]+(?=\s+)?)+)', inputString)

Если вы хотите найти каждую строку буквенно-цифровых символовпосле каждого «-» вы можете сделать это.

re.findall('(?<=-)[a-zA-Z\d]+')
0 голосов
/ 19 февраля 2019

Прежде всего, Python re не поддерживает классы символов POSIX.

Пробел не считается буквенно-цифровым, ваш первый шаблон соответствует - с [-.\:alnum:], а затем (.*) захватывает в группу 1 все 0 или более символов, кроме новой строки.Шаблон [-.\:alnum:] соответствует одному символу, который является либо -, ., :, a, l, n, u или m.Таким образом, при запуске с qwertyuio сопоставляется u и io включается в группу 1.

Буквенно-цифровые символы могут сопоставляться с шаблоном [^\W_].Таким образом, чтобы захватить все буквенно-цифровые символы после -, за которым следуют 0+ пробелов, вы можете использовать

re.findall(r'-\s*([^\W_]+)', s)

См. Демонстрационный пример regex

Подробнее

  • - - дефис
  • \s* - 0+ пробелов
  • ([^\W_]+) - Группа захвата 1: один или несколько (+) символы, которые являются буквами или цифрами.

Python demo :

print(re.findall(r'-\s*([^\W_]+)', '12 - mystr')) # => ['mystr']
print(re.findall(r'-\s*([^\W_]+)', 'qwertyuio'))  # => []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...