сделать регулярное выражение в Python - PullRequest
0 голосов
/ 12 декабря 2018

Как сделать регулярное выражение для этого в Python?

[1,12:12] call basic_while1() Error Code: 1046. No database selected

Я пробовал это '^\[(\d+),([0-9:]+)\]\s+(.+)$', но я не получаю никаких совпадений для этого вида ввода: ['1','12:12', 'call basic_while1()' ,'Error Code: 1046. No database selected'] с использованием этого регулярного выражения.

и что такое регулярное выражение, если я хочу получить вывод типа ['Error Code: 1046. No database selected']

Как создать регулярное выражение для этого, чтобы я мог получать совпадения?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вы соответствуете 3 группам захвата, и вам нужна четвертая группа, которая начинается после ().После закрытия ] вы можете добавить не жадное совпадение до совпадения до открывающей и закрывающей скобок:

^\[(\d+),(\d+:\d+)\]\s+(.*?\(\))\s+(.*)

См. Демонстрационную версию regex

Это будет соответствовать:

  • ^ Начало строки
  • \[ match [
  • (\d+) Захват в группе 1+ цифры
  • ,(\d+:\d+) Совпадение и захват в группе 1+ цифр, за которыми следуют двоеточие и 1+ цифры(Или [0-9:]+, но это будет более широкое совпадение)
  • \s+ Совпадение с 1+ пробельными символами
  • (.*?\(\)) Захват в группе любого персонажа 0+ раз без жадности и затем совпадение()
  • \s+(.*) Совпадение 1+ пробельных символов и захват любого символа 0+ раз
0 голосов
/ 12 декабря 2018

Здесь я делаю (рискованное) предположение, что в ваших текстах всегда будет подстрока Error Code.Поэтому я изменил ваше регулярное выражение на '^\[(\d+),([0-9:]+)\]\s+(.+)\s+(Error\sCode:.+)$'.Выполнение этого в оболочке:

>>> import re
>>> text = '[1,12:12] call basic_while1() Error Code: 1046. No database selected'
('1', '12:12', 'call basic_while1() Error Code: 1046. No database selected')
>>> re.match('^\[(\d+),([0-9:]+)\]\s+(.+)\s+(Error\sCode:.+)$', text)
<re.Match object; span=(0, 68), match='[1,12:12] call basic_while1() Error Code: 1046. N>
>>> _.groups()
('1', '12:12', 'call basic_while1()', 'Error Code: 1046. No database selected')

Если вам нужен список, просто используйте приведение типа.

>>> list(_)
['1', '12:12', 'call basic_while1()', 'Error Code: 1046. No database selected']

Примечание: _ в приведенном вышекоманда - это ярлык, указывающий оболочке Python повторно использовать предыдущий результат (в данном случае объект re.Match, а затем результат groups()).

Всего:

matches = re.match('^\[(\d+),([0-9:]+)\]\s+(.+)\s+(Error\sCode:.+)$', text)
if matches is not None:  # if there is no match, re.match returns None
    print(list(matches.groups()))

и что такое регулярное выражение, если я хочу получить вывод вроде ['Error Code: 1046. No database selected']

Вы можете просто проиндексировать последний элемент списка, используя [-1], а затем заключить его в скобки, чтобысоставить список.

print([matches.groups()[-1]])  # output => ['Error Code: 1046. No database selected']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...