Извлечь текст и целое число после конкретной буквы - PullRequest
0 голосов
/ 29 мая 2019

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

s = 'travel to africa x 2\ asia x 2\ europe x 2\ Airport pick up included. Furnitures 3 seater couch x 1 4 seater+ couch x 1 < 60 inches TV x 1 60 inches+ TV x 1 Washer - front loader x 1 Box / bag / misc x 1 The maximum clearance is 1.5m.'

Я хотел бы разделить его на x и извлечь число после него.

Итак, ожидаемый результат:

out = [('travel to africa', '2'),
       ('\ asia', '2'),
       ( '\ europe', '2'),
       ('\ Airport pick up included. Furnitures 3 seater couch', '1'),
       ('4 seater+ couch', '1'),
       ('< 60 inches TV', '1'),
       ('60 inches+ TV', '1'),
       ('Washer - front loader', '1'),
       ('Box / bag / misc', '1')]

Я пробовал это регулярное выражение, но не смог, потому что специальные символы, такие как -+<, были опущены (также должны быть другие специальные символы):

r'([A-Za-z 0-9]+)\s+x\s+(\d+)'

Что такое правильное регулярное выражение для извлечения этих значений? Или также возможно решение без регулярного выражения?

Ответы [ 3 ]

7 голосов
/ 29 мая 2019

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

re.findall(r'(.*?)\s+x\s*(\d+)', s)

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

Шаблон (.*?)\s+x\s*(\d+) соответствует

  • (.*?) - Группа 1: любые 0+ символов, кроме символов разрыва строки
  • \s+ - 1+ пробелов
  • x - x char
  • \s* - 0+ пробелов
  • (\d+) - Группа 2: одна или несколько цифр.

Если вы хотите избавиться от пробелов в начале матча, используйте re.findall(r'(\S.*?)\s+x\s*(\d+)', s) (см. regex demo ) или используйте понимание после получения всех совпадений, [x.strip() for x in re.findall(r'(.*?)\s+x\s*(\d+)', s)].

1 голос
/ 29 мая 2019

Мой взгляд на проблему:

import re
import pprint

s = 'travel to africa x 2\ asia x 2\ europe x 2\ Airport pick up included. Furnitures 3 seater couch x 1 4 seater+ couch x 1 < 60 inches TV x 1 60 inches+ TV x 1 Washer - front loader x 1 Box / bag / misc x 1 The maximum clearance is 1.5m.'

out = []

for g in re.findall(r'(((^|\\?).*?)\s*x\s*(\d+)(.*?))', s):
    out += [[g[1], g[3]]]

pprint.pprint(out)

Отпечатки:

[['travel to africa', '2'],
 ['\\ asia', '2'],
 ['\\ europe', '2'],
 ['\\ Airport pick up included. Furnitures 3 seater couch', '1'],
 [' 4 seater+ couch', '1'],
 [' < 60 inches TV', '1'],
 [' 60 inches+ TV', '1'],
 [' Washer - front loader', '1'],
 [' Box / bag / misc', '1']]
1 голос
/ 29 мая 2019

Вот один из способов сделать это. Я упростил задачу, просто попытавшись сопоставить каждую группу, а затем разделить вручную.

s = 'travel to africa x 2\ asia x 2\ europe x 2\ Airport pick up included. Furnitures 3 seater couch x 1 4 seater+ couch x 1 < 60 inches TV x 1 60 inches+ TV x 1 Washer - front loader x 1 Box / bag / misc x 1 The maximum clearance is 1.5m.'
import re
res = []
for match in re.finditer(".*?x\s*\d+", s):
    l, _, r = map(str.strip, match.group().rpartition('x'))
    res.append((l, r))

Вывод:

[('travel to africa', '2'),
 ('\\ asia', '2'),
 ('\\ europe', '2'),
 ('\\ Airport pick up included. Furnitures 3 seater couch', '1'),
 ('4 seater+ couch', '1'),
 ('< 60 inches TV', '1'),
 ('60 inches+ TV', '1'),
 ('Washer - front loader', '1'),
 ('Box / bag / misc', '1')]
...