Regex группировка до пробела - PullRequest
1 голос
/ 25 марта 2019

У меня есть такая строка:

[24 Mar 2019] ABC-000 somestring-with-numbers-and-dashes - a whole bunch of text

Регулярное выражение это:

re_header = re.compile(r'^\[(\d\d) ([A-Z][a-z][a-z]) (\d{4})\] '
                    + r'(ABC-\d+(?:-\d+)?)\s+'
                    + r'(.*?)\s*$')

Теперь я получаю вот что:

('24', 'Mar', '2019', 'ABC-000', 'somestring-with-numbers-and-dashes - a whole bunch of text')

ЧтоЯ хочу, однако, это дополнительная группа, состоящая из 'somestring-with-numbers-and-dashes', например:

('24', 'Mar', '2019', 'ABC-000', 'somestring-with-numbers-and-dashes')

Все, что стоит за 'somestring-with-numbers-and-dashes', следует игнорировать.

Как можноЯ достиг этого?

Ответы [ 4 ]

2 голосов
/ 25 марта 2019

Вы можете использовать

^\[(\d{2}) ([A-Z][a-z]{2}) (\d{4})\]\s*(DSA-\d+(?:-\d+)?)\s+([^\s-]+(?:-[^\s-]+)*)

См. Демонстрационную версию regex (поскольку ваш шаблон содержит DSA, а не ABC, я использовал DSA в своем шаблоне и демонстрационной строке в regex101).

Интересующая вас часть: ([^\s-]+(?:-[^\s-]+)*):

  • [^\s-]+ - 1+ символов кроме пробелов и -
  • (?:-[^\s-]+)* - 0 или более повторений -, за которыми следуют любые 1+ символов, кроме пробелов и -.
1 голос
/ 25 марта 2019

Другие проблемы в вашем регулярном выражении, если дата содержит только 1 цифру, а месяц - более 3 символов, например. 9 июня 2019. Кроме того, вы используете DSA в своем регулярном выражении, но как это может быть ABC в вашем выводе? Таким образом, чтобы приспособить их, будет лучше, если вы используете это регулярное выражение :

^\[(\d+) ([A-Za-z]+) (\d{4})\] ([A-Z]+-\d+(?:-\d+)?)\s+(\S*)
1 голос
/ 25 марта 2019

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

(.*?) - .*$

Таким образом, вы захватите как можно меньше текста, пока не придет -.

1 голос
/ 25 марта 2019

Просто измените окончательный (.*?)\s*$ на ([^\s]*):

re_header = re.compile(r'^\[(\d\d) ([A-Z][a-z][a-z]) (\d{4})\] '
                    + r'(ABC-\d+(?:-\d+)?)\s+'
                    + r'(\S*)')

Демо

Обратите внимание, мне пришлось изменить DSA на ABC вваше оригинальное выражение, чтобы заставить его работать.

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