Python Regex - найти все вхождения группы после префикса - PullRequest
1 голос
/ 27 января 2020

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

s1 = 'H: 1234.34.34'
s2 = 'H: 1234.34.34 12.12 123.5'

Я бы хотел разделить элементы пробелом после H внутри групп, поэтому я попытался:

myRegex = r'\bH\s*[\s|\:]+(?:\s?(\b\d+[\.?\d+]*\b))*'

Это нормально со строкой s1

print(re.search(myRegex , s1).groups())

Я даю мне: ('1234.34.34',) => Все нормально

Но для s2 у меня есть:

print(re.search(myRegex , s2).groups())

Он отправляет обратно только последнюю группу ('123,5',), но я ожидаю, что получу ('1234.34.34', '12 .12 ',' 123,5 ').

У вас есть идея, как получить мое ожидаемое значение?

Кроме того, я не ограничен двумя группами, у меня может быть гораздо больше ...

Большое спасибо

Фред

Ответы [ 3 ]

0 голосов
/ 27 января 2020

В вашем шаблоне, в этой части (?:\s?(\b\d+[\.?\d+]*\b))* у вас есть группа захвата внутри повторяющейся группы без захвата, которая даст группе захвата значение последней итерации внешней группы без захвата.

последняя итерация будет соответствовать 123.5, и это будет значение группы 1.

Один из вариантов - сопоставить весь шаблон и использовать группу захвата для последней части.

\bH: (\d+(?:\.\d+)+(?: \d+(?:\.\d+)+)*)\b

Regex demo | Python демо

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

import re

s2 = 'H: 1234.34.34 12.12 123.5'
myRegex = r'\bH: (\d+(?:\.\d+)+(?: \d+(?:\.\d+)+)*)\b'

res = re.search(myRegex , s2)
if res:
    print(res.group(1).split())

Выход

['1234.34.34', '12.12', '123.5']

Использование Модуль регулярных выражений PyPi , вы можете использовать \G, чтобы получить итеративные совпадения для чисел, и использовать \K, чтобы забыть то, что в данный момент совпало, что будет пробелом перед числом.

(?:\bH:|\G(?!A)) \K\d+(?:\.\d+)+

Regex demo | Python демо

0 голосов
/ 27 января 2020

Исходя из ваших примеров, вам не нужно регулярное выражение, split () будет достаточно:

s1 = 'H: 1234.34.34'
s2 = 'H: 1234.34.34 12.12 123.5'

match1 = s1.split()[1:]
match2 = s2.split()[1:]

print(match1)
print(match2)

['1234.34.34']
['1234.34.34', '12.12', '123.5']
0 голосов
/ 27 января 2020

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

s2 = 'H: 1234.34.34 12.12 123.5'

output = s2.split("H: ")[-1].split()

Вывод будет ['1234.34.34', '12.12', '123.5']

Первый сплит позволит вам получить все ваши символ после "H: "

Во втором разбиении ваши предложения будут разделены по пробелам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...