Python регулярное выражение для захвата описания - PullRequest
2 голосов
/ 19 марта 2020

Я пытаюсь захватить любую группу слов с ровно одним пробелом между ними и может содержать не алфавитные c символы. Например, со строкой

HOSE 1/4 X BSP F 3/8             Each

Я хотел бы получить только HOSE 1/4 X BSP F 3/8.

Я пробовал шаблон (?P<descr>(\w+\s)+) безуспешно. Также иногда '/' есть, а иногда его нет.

ПРИМЕЧАНИЕ : я использую библиотеку invoice2data для извлечения позиций из счета-фактуры и регулярного выражения требуется.

Ответы [ 3 ]

2 голосов
/ 19 марта 2020

Если регулярное выражение не требуется, вы можете легко получить то, что вам нужно, с помощью s.split(' ')[0].

Если вам нужно использовать регулярное выражение, вы можете использовать

^(?P<descr>\S+(?:\s\S+)*)

См. regex demo

Подробности

  • ^ - начало строки
  • \S+ - 1+ непробельных символов
  • (?:\s\S+)* - 0 или более повторений одного пробела с 1+ непробельными символами.

См. Python demo :

s = "HOSE 1/4 X BSP F 3/8             Each"
print ( s.split('  ')[0] )
# => HOSE 1/4 X BSP F 3/8

import re
m = re.search(r'^(?P<descr>\S+(?:\s\S+)*)', s)
if m:
  print( m.group("descr") )
# => HOSE 1/4 X BSP F 3/8
1 голос
/ 19 марта 2020

Довольно ясно, что описание может содержать произвольный текст, поэтому \w не применяется. Что отличает описание от остальной части строки, это необычно большое количество пробелов. В этом случае вам не нужно регулярное выражение:

line = 'HOSE 1/4 X BSP F 3/8             Each\n'
descr = line.split('   ')[0]

Я использовал здесь три пробела в качестве безопасной ставки. Если число является фиксированным, и вы знаете его заранее, используйте его вместо этого.

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

(?P<descr>^.+?(?=   ))

+? будет делать жадный захват любых символов в начале строки, если за ними следуют три или более пробела. Сами конечные пробелы не захватываются, потому что они проверены положительным прогнозом (?= ).

0 голосов
/ 19 марта 2020

Вы можете использовать это регулярное выражение с группой захвата в python:

>>> import re
>>> s = 'HOSE 1/4 X BSP F 3/8        Each'
>>> print (re.findall(r'(?:^\s?|\S\s)(\S+(?: \S+)*)', s))
['HOSE 1/4 X BSP F 3/8']

Демонстрация RegEx

Подробности RegEx:

  • (?:^\s?|\S\s): убедитесь, что у нас есть начальная позиция или пробел после начала или пробел после непробельного символа
  • (\S+(?: \S+)*): совпадение 1 или более подстрок, разделенных одним пробелом
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...