лучший способ найти подстроку с помощью регулярного выражения в python 3 - PullRequest
1 голос
/ 29 мая 2020

Я пытался найти лучший способ найти определенную подстроку c в паре значений ключа, используя re для следующего:

some_string-variable_length/some_no_variable_digit/some_no1_variable_digit/some_string1/some_string2
eg: aba/101/11111/cde/xyz or aaa/111/1119/cde/xzx or ada/21111/5/cxe/yyz

здесь все переменно и то, что я искал, выглядит примерно так, как показано ниже, в паре значений ключа:

`cde: 2` as there are two entries for cde

cxe: 1 as there is only one cxe

Примечание: здесь все переменно, кроме / . ie cde или cxe или какая-то строка будет там точно после двух / в каждом случае

input:aba/101/11111/cde/xyz/blabla
output: cde:xyz/blabla
input: aaa/111/1119/cde/xzx/blabla
output: cde:xzx/blabla
input: aahjdsga/11231/1119/gfts/sjhgdshg/blabla
output: gfts:sjhgdshg/blabla

Если вы заметили, мой ключ всегда является первой строкой после 3-го / и значение всегда является подстрокой после ключа

Ответы [ 3 ]

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

Вот несколько решений, основанных на вашем описании, что «ключ всегда является первой строкой после 3-го /, а значение всегда является подстрокой после ключа». Первый использует str.split с maxsplit из 4, чтобы собрать все после четвертого / в значение. Второй использует регулярное выражение для извлечения двух частей:

inp = ['aba/101/11111/cde/xyz/blabla',
        'aaa/111/1119/cde/xzx/blabla',
        'aahjdsga/11231/1119/gfts/sjhgdshg/blabla'
        ]

for s in inp:
    parts = s.split('/', 4)
    key = parts[3]
    value = parts[4]
    print(f'{key}:{value}')

import re

for s in inp:
    m = re.match(r'^(?:[^/]*/){3}([^/]*)/(.*)$', s)
    if m is not None:
        key = m.group(1)
        value = m.group(2)
        print(f'{key}:{value}')

Для обеих частей кода вывод

cde:xyz/blabla
cde:xzx/blabla
gfts:sjhgdshg/blabla
0 голосов
/ 29 мая 2020

Другие уже опубликовали различные регулярные выражения; более широкий вопрос - лучше ли решить эту проблему с помощью регулярного выражения? В зависимости от того, как данные отформатированы в целом, их лучше проанализировать, используя

  • метод .split('/') для строки ; или
  • csv.reader(..., delimiter='/') или csv.DictReader(..., delimiter='/') в модуле csv .
0 голосов
/ 29 мая 2020

Попробовать (?<!\S)[^\s/]*(?:/[^\s/]*){2}/([^\s/]*)

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


Попробовать новую

(?<!\S)[^\s/]*(?:/[^\s/]*){2}/([^\s/]*)(?:/(\S*))?

демо2

...