Как преобразовать регулярное выражение в список - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть строка регулярного выражения только с | и () как:

(Привет | Привет) меня зовут (Боб | Роберт)

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

Привет, меня зовут Боб Привет меня зовут роберт привет меня зовут Боб Привет, меня зовут Роберт

Это инструмент (библиотекарь), который уже делает это?

Моя первая проблема - разбить строку регулярного выражения на массив, например:

[['Hello','Hi'],'my name is' ,['Bob','Robert']]

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Попробуйте exrex, подумайте, что должно работать для вас

Простой скрипт

import exrex
print(list(exrex.generate('(Hello|Hi) my name is (Bob|Robert)')))

выход

→ python new_test.py
['Hello my name is Bob', 'Hello my name is Robert', 'Hi my name is Bob', 'Hi my 
name is Robert']

https://github.com/asciimoo/exrex

0 голосов
/ 09 ноября 2018

Вы можете попробовать следующее решение, здесь я не импортировал ни одного модуля. Используются только следующие функции: strip, split and replace

input_string = "(Hello|Hi) my name is (Bob|Robert)"
split_string = (input_string.replace("("," ").replace(")"," ")).split("  ")
print ([i.strip().split("|") for i in split_string])

#Output --> [['Hello', 'Hi'], ['my name is'], ['Bob', 'Robert']]

Надеюсь, это поможет!


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

from itertools import product
input_string = "(Hello|Hi) my name is (Bob|Robert)"
split_string = (input_string.replace("("," ").replace(")"," ")).split("  ")
jj = [i.strip().split("|") for i in split_string]
kk = list(product(*jj))
print ([" ".join(i) for i in kk])
#output --> ['Hello my name is Bob', 'Hello my name is Robert', 'Hi my name is Bob', 'Hi my name is Robert']

Приведенный выше код также будет работать для: input_string = "(Hello | Hi | Hey) my (name | naam) is (Bob | Robert)"

0 голосов
/ 09 ноября 2018

Сделайте это с помощью регулярного выражения: -)

re.split(r"(\(.+?\|.+?\))",s)
Out: ['', '(Hello|Hi)', ' my name is ', '(Bob|Robert)', '']
# and for each string in the list:
re.split(r"\((.+?)\|(.+?)\)",'(Hello|Hi)')
Out: ['', 'Hello', 'Hi', '']
...