2013-09-13 2 views
3

Есть ли способ сделать полностью обратное сопоставление регулярного выражения, что я использую.Отрицательное соответствие шаблону RegEx в эквиваленте Python для Perl (! ~ Operator)

(?!...) работает только для простого рисунка. Я имею в виду, что у меня есть RegEx, чтобы соответствовать нескольким форматам, но я хотел заменить все в строке, кроме моих мультиформатных форматов.

Скажем например: Я написал комплексный шаблон RegEx, чтобы найти дни недели, часы, месяцы, годы. Вместо того, чтобы находить эти совпадения и разбивать мою строку с помощью этого шаблона и присоединять все, что соответствует; если есть обратное совпадение, я мог бы просто заменить его одним выстрелом.

Решение, данное в How to "inverse match" with regex?, не поддерживает все.

Пример

hr = """ 
Monday: 11:30am - 9:30pm Tuesday: 11:30am - 9:30pm 
Wednesday: 11:30am - 10:00pm Thursday: 11:30am - 10:00pm 
Friday: 11:30am - 10:30pm Saturday: 11:00am - 10:30pm 
(brunch served until 3pm) Sunday: 10:30am - 9:30pm (brunch served until 3pm) 
Happy Hour and Special Appetizer menu starting at $3 in the bar. Hours from 4 - 7pm Daily. 
$4 BURGER special available on Monday. Wednesday: 1/2 off all bottled wines (4-close)""" 


import re 

newStr = [] 
dayPattern = """ 
    (?:mon|tue|wed|thu|fri|sat|sun|thurs)(?:day)?(?:[.:])* 
    \s* 
    (?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m.?) # Start hour 
    \s*[-|to]+\s* 
    (?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m.?) # Close hour 
""" 

newStr.extend(\ 
    re.findall(re.compile(dayPattern, re.VERBOSE|re.IGNORECASE), hr)) 

print " ".join(newStr) 

ВЫВОД

Monday: 11:30am - 9:30pm Thursday: 11:30am - 10:00pm Friday: 11:30am - 10:30pm Sunday: 10:30am - 9:30pm 

Но я здесь не хватает "Monday: 11:30am - 9:30pm Tuesday: 11:30am - 9:30pm Wednesday: 11:30am - 10:00pm Thursday: 11:30am - 10:00pm Friday: 11:30am - 10:30pm".

Я мог бы изменить мое регулярное выражение, чтобы включить эту модель слишком

Но вместо того, чтобы делать, как это, есть ли способ я могу удалить любое слово, кроме понедельника/вторник/.... & пн/вт/ср. .. & 11:00 am/12pm ...

т.е. именно я хочу это выход: Monday: 11:30am - 9:30pm Tuesday: 11:30am - 9:30pm Wednesday: 11:30am - 10:00pm Thursday: 11:30am - 10:00pm Friday: 11:30am - 10:30pm Saturday: 11:00am - 10:30pm Sunday: 10:30am - 9:30pm

+0

может быть, если вы могли бы поместить свой код, который мы можем помочь –

+0

Не могли бы вы включить код, который вы имеете до сих пор , и пример ввода/вывода? Трудно понять, что вы пытаетесь сделать. – amon

+3

Случайно, вы имеете в виду оператора! ~? –

ответ

0

Я не понимаю вашего намерения делать обратное регулярное выражение. findall() кажется естественным путем выбора вашего времени, как это:

' '.join(re.findall(r'\w{3,6}day:\s*\d{1,2}:\d{1,2}[ap]m\s*-\s*\d{1,2}:\d{1,2}[ap]m', hr)) 

она дает:

'Monday: 11:30am - 9:30pm Tuesday: 11:30am - 9:30pm Wednesday: 11:30am - 10:00pm Thursday: 11:30am - 10:00pm Friday: 11:30am - 10:30pm Saturday: 11:00am - 10:30pm Sunday: 10:30am - 9:30pm' 
+0

Итак, я должен оптимизировать свой RegEx, чтобы соответствовать максимальным параметрам, вместо обращения к обратному регистру. – Garfield

+0

@codelover: При таком вводе, да, я бы придерживался такого подхода.Это 'регулярное выражение' очень простое, и есть возможность добавить некоторые чередования, взгляды и тому подобное. – Birei

+0

@Bieri Спасибо, пожалуйста, рекомендуйте некоторые ссылки для поиска – Garfield

Смежные вопросы