2012-12-19 2 views
-1

Это мои входных строкиPython: RegEx для получения групп от «дня, дня, дня от часа до мин»

1. Mon,Tue,Wed from 10AM to 12PM 
2. Mon from 10AM to 12PM 
3. Mon, Tue, Wed, Thu from 10AM to 12PM 

Я хочу, чтобы мои группы быть

1. ["Mon,Tue,Wed", "10AM","12pm"] 
2. ["Mon", "10AM", "12PM"] 
3. ["Mon, Tue, Wed, Thu", "10AM", "12PM"] 

Здесь первых группы поставляется с 3-х недельными неделями, разделенными запятой, Я не понимаю, как найти RegEx для поиска первой группы.

Я пробовал:

(^((mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|m|w|f),?){1,} # Weekday 
\s*[from]*\s* # Seperator 
(\d{1,2}(?:[:]\d{1,2})?)\s*([ap][.]?m.?) # Start hour 
\s*[-,(to)]+\s* # Seperator 
(\d{1,2}(?:[:]\d{1,2})?)\s*([ap][.]?m.?)) # Close hour 
+0

Это поможет, если вы покажете, что вы сделали до сих пор; тогда кто-то может указать вам в правильном направлении. Запрос на решение, не показывающий предшествующие усилия, обычно не одобряется [so]. –

+0

Я пробовал (^ ((mon | tue | wed | thu | fri | sat | sun | mo | tu | we | th | fr | sa | su | m | w | f),?) {1,} # Weekday \ s * [from] * \ s * # Seperator (\ d {1,2} (?: [:] \ D {1,2})?) \ S * ([ap] [.]? M .?) # Начальный час \ s * [-, (to)] + \ s * # Сеператор (\ d {1,2} (?: [:] \ D {1,2})?) \ S * ([ap] [.]? m.?)) # Закрыть час – Garfield

+0

@flower: обновите вопрос, с чем пытались, а не в комментарии – avasal

ответ

3

Используется для использования с re.findall. Результат, полученный в 1, 2 и 3 группах захвата. Более поздние добавления основаны на регулярном выражении, которое вы добавили в комментарий.

r'(?i)((?:sun|mon|tue|wed|thu|fri|sat)(?:\s*,\s*(?:sun|mon|tue|wed|thu|fri|sat))*)\s+from\s+(\d{1,2}(?::\d{1,2})?(?:[ap]m|[ap]\.m\.))(?:\s+to\s+|\s*[-,]\s*)(\d{1,2}(?::\d{1,2})?(?:[ap]m|[ap]\.m\.))' 

REGEX ломаются:

  • Case нечувствительным

    (?i) 
    
  • Список дней недели. Разрешить гибкий интервал. Нет трейлинг или дополнительный , допускается:

    ((?:sun|mon|tue|wed|thu|fri|sat)(?:\s*,\s*(?:sun|mon|tue|wed|thu|fri|sat))*) 
    
  • Там должно быть по крайней мере один пробел до и после from.

    \s+from\s+ 
    
  • номер Совпадение с последующим AM/PM (может быть am или a.m., но не a.m или am. - то же самое для pm). Также дайте возможность указать минуту.

    (\d{1,2}(?::\d{1,2})?\s*(?:[ap]m|[ap]\.m\.)) 
    
  • Я расслабился условие to детали: в части может быть to или - или ,. Должно быть место до и после to, но - и , не нуждается в пространстве, чтобы предшествовать/преуспеть.

    (?:\s+to\s+|\s*[-,]\s*) 
    
  • То же, что и выше

    (\d{1,2}(?::\d{1,2})?\s*(?:[ap]m|[ap]\.m\.)) 
    

Этот подход во время расщепления ввода в лексемы, также проверяет маркеры.

Если валидация не нужна, вы можете использовать расщепление, например, theharshest.Я бы использовал re.split и сначала разделил на r'\s+from\s+', затем разделил 2-й токен на r'\s*(to|[-,])\s*'.

+0

Я получил [('Tue, Wed', '10AM', '12PM ')], Mon отсутствует в первой группе. – Garfield

+0

Я могу использовать @theharshest, но из обычно не всегда бывает просто пространство, иногда его «-». Так что я мог бы пойти re.split() – Garfield

+0

@flower: Я прочитал намерение в вашей неудачной попытке и изменил его, чтобы он работал. – nhahtdh

4

Вам не нужно регулярное выражение здесь, просто разделить, используя ключевые слова 'от' и 'до' -

Для первого примера, если s ваша строка -

>>> s.split('from')[0] 
'Mon,Tue,Wed ' 
>>> s.split('from')[1].split('to') 
[' 10AM ', ' 12PM'] 
Смежные вопросы