Получение всего до точки с помощью регулярного выражения?

#python #regex

#python #регулярное выражение

Вопрос:

У меня есть строка, которая выглядит так:

 STRING 1 160 Some descriptor information. /Uselessstuff.; STRING 161 274 Some other descriptor information. /Moreuselessstuff.; STRING 275 1070 Last descriptor info. /Lastuselesspart.
  

Теперь я хотел бы извлечь два целых числа и информацию, которая следует за точкой, а затем игнорировать все до конца строки или до точки с запятой. Поэтому я надеюсь, что в итоге:

 [('1', '160', 'Some descriptor information'), ('161', '274', 'Some other descriptor information'), ('275', '1070', 'Last descriptor info')]
  

Я пробовал:

 import re
s = "STRING 1 160 Some descriptor information. /Uselessstuff.; STRING 161 274 Some other descriptor information. /Moreuselessstuff.; STRING 275 1070 Last descriptor info. /Lastuselesspart."
re.findall(r'(d )s(d )s(w )', s)
  

Однако это дает только следующее:

 [('1', '160', 'Some'), ('161', '274', 'Some'), ('275', '1070', 'Last')]
  

Как я могу получить остальную информацию до точки?

Ответ №1:

Ваше регулярное выражение будет,

 (d )s(d )s([^.]*)
  

ДЕМОНСТРАЦИЯ

Ваш код на python будет,

 >>> s = "STRING 1 160 Some descriptor information. /Uselessstuff.; STRING 161 274 Some other descriptor information. /Moreuselessstuff.; STRING 275 1070 Last descriptor info. /Lastuselesspart."
>>> m = re.findall(r'(d )s(d )s([^.]*)', s)
>>> m
[('1', '160', 'Some descriptor information'), ('161', '274', 'Some other descriptor information'), ('275', '1070', 'Last descriptor info')]
  

Объяснение:

  • (d ) Захватывает одну или несколько цифр в группу.
  • s За приведенными выше записанными цифрами будет следовать пробел.
  • (d ) Снова одна или несколько цифр записываются во вторую группу.
  • s За которым следует один пробел.
  • ([^.]*) Захватывает любой символ, не являющийся буквальной точкой ноль или более раз.

Комментарии:

1. Спасибо за объяснение! Это всегда помогает с регулярными выражениями.

Ответ №2:

Использование [^.] вместо w будет выбирать все символы до точки.

Ответ №3:

Вы можете использовать символьный класс, чтобы разрешать только символы word и пробелы.

 >>> re.findall(r'(d )s*(d )s*([ws] )', s)
[('1', '160', 'Some descriptor information'), ('161', '274', 'Some other descriptor information'), ('275', '1070', 'Last descriptor info')]
  

Рабочая демонстрация