Я прочитал все связанные сообщения и просмотрел интернет, но это действительно избивает меня.Как сделать отрицательный взгляд Python менее жадным?
У меня есть текст, содержащий дату.
Я хотел бы зафиксировать дату, но не если ей предшествует определенная фраза.
Простое решение - добавить отрицательный lookbehind в мой RegEx.
Вот несколько примеров (с помощью findall).
Я только хочу зафиксировать дату, если ей не предшествует фраза «от».
19-2-11
что-то что-то 15-4-11
такие и такие, как из 29-5-11
Вот мое регулярное выражение:
(?<!as of)(\d{1,2}-\d{1,2}-\d{2})
Ожидаемые результаты:
['19 -2-11 ']
['15 -4-11']
[]
Фактические результаты:
['19] -2-11'
['15 -4-11 ']
[' 9-5-11' ]
Обратите внимание, что это-не 29. Если я изменяю \d{1,2}
к чему-то твердому, как \d{2}
на первый шаблоне :
bad regex for testing: (?<!as of)(\d{2}-\d{1,2}-\d{2})
Затем я получаю ожидаемые результаты. Конечно, это не хорошо, потому что я хотел бы сопоставлять 2-значные дни, а также однозначные дни.
По-видимому, мой отрицательный lookbehind - это жадность - moreso, чем мой захват даты, поэтому он крадет цифру из нее и терпит неудачу. Я пробовал все средства для исправления жадности, о которой я могу думать, но я просто не знаю, чтобы исправить это.
Я бы хотел, чтобы мой захват даты соответствовал максимальной жадности, а затем применялся мой негативный вид. Это возможно? Моя проблема казалась хорошим использованием негативных взглядов и не слишком сложной. Я уверен, что смогу сделать это по-другому, если нужно, но я хотел бы узнать, как это сделать.
Как сделать отрицательный взгляд Python менее жадным?
Это фантастика, я нахожу '(?:^| \ S +)' и ваше объяснение очень ясное. Я чувствую, что на мой вопрос ответили.:) Чисто ради знания и не необходимости Я хотел бы узнать, как изменить это, поэтому '\ s' является необязательным, так что' something something15-4-11' будет соответствовать, но я могу быть в состоянии это сам. Спасибо! –
@ChristopherGalpin Я думаю, что это может быть достигнуто очень легко, используя '*' (от 0 до бесконечности вхождения) вместо '+' (от 1 до бесконечности вхождения) в этой части шаблона: '(?:^| \ S +) ' – ovgolovin
Я надеялся, что это так просто, но, видимо, нет, ломает совпадение« как », так же, как и исходный вопрос. –