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

#python #regex

#python #регулярное выражение

Вопрос:

Предположим, у меня есть эти две строки:

 s1 = 'hello 4, this is stackoverflow, looking for help (1345-today is wednesday)'
s2 = 'hello again, this is a (bit-more complicated), string (67890123 - tomorrow is thursday)'
  

Я хочу использовать регулярное выражение для сопоставления с шаблоном (number-words) , а затем разделить строки, чтобы получить список кортежей:

 final = [('hello 4, this is stackoverflow, looking for help', '1345-today is wednesday'),
         ('hello again, this is a (bit-more complicated), string', '67890123 - tomorrow is thursday')]
  

Я пытался, ([0-9] -(.*?)) но безуспешно.

Что я делаю не так? Есть идея найти обходной путь?

Заранее спасибо!!

Комментарии:

1. Попробуйте list(filter(None, re.split(r's*(?=([0-9] s*-s*[a-zA-Z])', s1)))

Ответ №1:

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

 >>> regx = re.compile(r'^(.*?)s*((d s*-s*w [^)]*))')
>>> arr = ['hello 4, this is stackoverflow, looking for help (1345-today is wednesday)', 'hello again, this is a (bit-more complicated), string (67890123 - tomorrow is thursday)']
>>> for el in arr:
...     regx.findall(el)
...
[('hello 4, this is stackoverflow, looking for help', '1345-today is wednesday')]
[('hello again, this is a (bit-more complicated), string', '67890123 - tomorrow is thursday')]
  

Подробности регулярных выражений:

  • ^(.*?) : Сопоставьте 0 или более символов в начале в группе # 1
  • s* : Сопоставьте 0 или более пробелов
  • ((d s*-s*w [^)]*)) : Сопоставьте (<number>-word ..) строку и зафиксируйте то, что находится внутри скобок, в группе захвата # 2

В качестве альтернативы, вы можете использовать это регулярное выражение в split :

 >>> import re
>>> reg = re.compile(r'(?<!s)s*(?=((d s*-s*w [^)]*)))')
>>> for el in arr:
...     reg.split(el)[:-1]
...
['hello 4, this is stackoverflow, looking for help', '1345-today is wednesday']
['hello again, this is a (bit-more complicated), string', '67890123 - tomorrow is thursday']
  

Демонстрация регулярных выражений

Подробности регулярных выражений:

  • (?<!s) : Если у нас нет пробела в предыдущей позиции
  • s* : Сопоставление 0 пробелов
  • (?=((d s*-s*w [^)]*))) : Посмотрите вперед, чтобы указать строку впереди нас, которая есть (<number>-word ..) . Обратите внимание, что мы используем группу захвата, чтобы получить строку внутри (...) в результате split .

Комментарии:

1. И как просто получить строку внутри (…) в результате разделения?

2. Вы хотите избавиться от 'hello 4, this is stackoverflow, looking for help' или (1345-today is wednesday) ?

3. Я хочу получить кортеж ('hello 4, this is stackoverflow, looking for help', '1345-today is wednesday') и шаблон <число-слово> без круглых скобок. И нет, нет текста после шаблона (число-слово)

4. Рад, что это сработало. Я findall также добавил решение.

Ответ №2:

Это может подтолкнуть вас в правильном направлении:

 >>> re.findall(r'^(.*) ((. ?))$', s1)
[('hello 4, this is stackoverflow, looking for help', '1345-today is wednesday')]