#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')]