#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 или более символов в начале в группе # 1s*
: Сопоставьте 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')]