ведущий пробел перед результатом из регулярного выражения - PullRequest
0 голосов
/ 08 апреля 2020

Я использую правило для получения подстроки в python с использованием регулярного выражения. Но я обнаружил, что у некоторых результатов будут пробелы, а у некоторых - нет. Я знаю, что могу удалить пробел с помощью .strip (). Но я хочу понять, почему существуют пробелы. Кто-нибудь может помочь?

Спасибо

Пример 1. (без пробелов).

import re
utterance = 'can i make a call to +21231313'
re.findall('[-|#|+]*[0-9]*[-\s]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*', utterance.strip())

результат:

['+21231313']

Пример 2. (начальный пробел).

import re
utterance = 'can i make a call to -21231313'
re.findall('[-|#|+]*[0-9]*[-\s]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*', utterance.strip())

результат:

[' -21231313']

Пример 3. (начальный пробел).

import re
utterance = 'can i make a call to 21231313'
re.findall('[-|#|+]*[0-9]*[-\s]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*', utterance.strip())

результат:

[' 21231313']

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Первая порция шаблонов может соответствовать пустой строке, '[-|#|+]*[0-9]*[-\s]*[(]{0,1}.

. Вы можете сделать это, сделав di git обязательным совпадение части, делая необязательным образец дефиса / пробела, и оберните его необязательная группа, (?:[0-9]+[-\s]*)?. Кроме того, вы можете избегать пробелов в конце матча, если перефакторизовать последний шаблон [-\s\./0-9]* на (?:[-\s./]*[0-9])*.

Использовать

[-#+]*(?:[0-9]+[-\s]*)?\(?[0-9]{1,4}\)?(?:[-\s./]*[0-9])*
      ^^^^^^^^^^^^^^^^^                ^^^^^^^^^^^^^^^^^^  

См. regex demo

Подробности

  • [-#+]* - ноль или более -, # или +
  • (?:[0-9]+[-\s]*)? - необязательная группа без захвата, соответствующая 1 или 0 вхождениям, состоящим из 1+ цифр и затем 0+ дефисов / пробелов
  • \(? - необязательно (
  • [0-9]{1,4} - от одной до четырех цифр
  • \)? - необязательный )
  • (?:[-\s./]*[0-9])* - 0 или более вхождений
    • [-\s./]* - 0 или более дефисов , пробелы, . или /
    • [0-9] - ди git.
1 голос
/ 08 апреля 2020

В RE * будет проверять наличие 0 или более вхождений выражения. Таким образом, пространство появляется только для последнего блока вашего регулярного выражения, где каждый второй блок интерпретируется как пустой. Посмотрите на конечный автомат:

state machine with minus sign

Последний блок ([-\s\./0-9]*) будет принимать любое количество из перечисленных символов, включая space и знак - но не +. Если ваше выражение имеет знак плюс, результатом будет:

state machine with plus sign

Поскольку единственный блок, который принимает +, является первым блоком, а в space нет первый. Из-за этого, если регулярное выражение распознает знак плюс, в совпадении не будет пробелов.

...