2014-11-18 3 views
0

которые я хотел бы, чтобы найти 30, 12/1, 2, 3 и так далее, в каком календаре данных я разборе от HTML, но не 2014‍‍ или 09:30Python Regex найти все даты

До сих пор я пытался

[\d]{1,2}[/]?[\d]{1,2}[^:] 

и множество разных вариантов, но ничего похожего не подходит. Есть ли способ поиска нужных дат с одним регулярным выражением, или было бы более целесообразно задать либо число от 0 - 31, либо строки с номерами строк и /? Спасибо за любую помощь :)

Edit:

Данные я разбор выглядит следующим образом:

30 
Name, Ofsomeone 
Name, Ofsomeone 
Name, Ofsomeone 
weg.ics 
GMT+01:00Amsterdam,Berlin,Bern,Rome,Stockholm,Vienna 
weg:December2014 
Day 
WorkWeek 
Week 
Month 
Today 
December2014 
December2014 
Monday 
Tuesday 
Wednesday 
Thursday 
Friday 
Saturday 
Sunday 
12/1 
Name, Ofsomeone 
Name, Ofsomeone 
Name, Ofsomeone 
2 
Name, Ofsomeone 
Name, Ofsomeone 
3 
Name, Ofsomeone 
Name, Ofsomeone 
+0

Не могли бы вы опубликовать фрагмент HTML-кода, который вы пытаетесь проанализировать? – gcarvelli

+0

Пожалуйста, добавьте список строк, которые должно соответствовать вашему регулярному выражению, и что не должно. Что вы пробовали? – igon

ответ

2

Это звучит, как правило, вы хотите это: число от 1 до 31, как само слово (не часть даты, времени, 4-значного числа и т. Д.), Или дата в формате m/d.

Предположим, вы готовы принять любое 1- или 2-значное число, а не пытаться отклонить 75 или 38/2 или 2/30 в самом регулярном выражении.

  • У вас есть детали [\d]{1,2}, хотя там нет необходимости в кронштейнах.
  • Мы могли бы написать это как чередование между двумя отдельными шаблонами, но немного интереснее написать его с дополнительным / и номером, поэтому давайте сделаем это.
  • Чтобы сделать это необязательным, нам нужно что-то приложить модификатор ?, что означает группу. И, по-видимому, вы не хотите записывать день отдельно, так что это не захватывающая группа.
  • Чтобы обработать «сам по себе», поскольку это, по-видимому, фактически означает линию само по себе, мы можем просто использовать многострочный режим и ^ и $ шаблон.

Итак:

^\d{1,2}(?:/\d{1,2})?$ 

Regular expression visualization

Debuggex Demo

Если вы сделал хотите написать 1-31 в регулярное выражение, вы, вероятно, хотите, чтобы изменить это необязательный 1-12 и косой чертой, а затем 1-31, который будет большим беспорядком (^(?:(?:\d|(?:1[0-2]))/)?(?:(?:[12]?\d)|(?:3[01]))$); если вы хотите также обрабатывать 30 и 29 в зависимости от первого значения ... просто даже не пытайтесь это сделать.


Это оригинальный ответ на другой вопрос, как изначально указано.

Похоже, что вы хотите правило: два (1 или 2-значных) номера, разделенные дефисом или косой чертой с дополнительными пробелами.

Таким образом, просто перевести, что повторно синтаксис:

  • У вас есть [\d]{1,2} части, хотя на самом деле нет необходимости в скобках.
  • Вы хотите либо дефис, либо косую черту, а не косую черту или ничего, поэтому измените [/]? на [-/].
  • Вы хотите разрешить пробелы вокруг дефиса или косой черты, поэтому добавьте \s* с каждой стороны.
  • Я не знаю, почему вы пытаетесь исключить следующий двоеточие, потому что 09:30 уже не будет соответствовать шаблону.

Итак:

\d{1,2}\s*[-/]\s*\d{1,2} 

Regular expression visualization

Debuggex Demo

Обратите внимание, что он соответствует всем 1 - 31, 10/27, 11/1, 12/1, и не соответствует 2014 или 09:30.

+0

Похоже, что OP хочет '-' (пробел пространства) или '/' (просто косая черта) посередине. Хотя ваше решение более гибкое ... – iCodez

+0

@iCodez: теперь, когда он предоставлен ввод, нет значений с дефисами вообще, пробелами или иным образом и без значений с косой чертой с пробелами, чтобы сообщить нам, должны они совпадать или нет, так что ... на самом деле, это все еще просто догадка о том, что он хочет ... – abarnert

+0

Извините за мою неудачу, я ищу число от 1 до 31. В строке im parsing есть и не должно быть никакого дефиса или пробела:/ Редактирование моего вопроса. Но спасибо за ваше объяснение. :) Все еще регулярное регулярное выражение и советы всегда приветствуются :) – BigZ

0

это может работать для вас:

[\d]{1,2} ?([^:][\/]|-) ?[\d]{1,2} 

Regular expression visualization

Debuggex Demo

Примечания: нужно знак между буксиром [\d]{1,2}, что пробела после первой и второй могут быть необязательными, что мы сделайте это с помощью potting ? после пробела и в центре рисунка, который не может быть :([^:]) и может быть /([\/]) или (|) -.