Якоря в Regex

1
  • В Python Regex необходимо ^ или $ появляются только один раз?
  • Я попытался совместить две строки с

    ^(.*\|.*)$^.*$
    

    Это не работает. Как вы соответствуете несколько строк?

Примечание. Я не программирую на Python, но использую Regex в стиле Python в своем редакторе gedit.

Спасибо и приветствую!

  • 0
    ОП нуждается в этом для Гедит. Я предлагаю askubuntu.com . Кстати, вопрос можно перенести в аскубунту отсюда? Его нет в списке, когда мы говорим о оффтопе при голосовании за закрытие.
  • 0
    Я не думаю, что есть принципиальная разница в том, где спросить об использовании регулярных выражений в стиле Python.
Показать ещё 2 комментария
Теги:

6 ответов

6
Лучший ответ

Как говорили другие ответы, вы ищете re.MULTILINE, но даже с тем, что ваше регулярное выражение не будет работать.

$ соответствует позиции до разрыва строки, а ^ соответствует началу строки, поэтому $^ в середине регулярного выражения никогда не будет совпадать. Например:

>>> re.search("^(.*)$^.*$", multiline_string, re.M)    # won't match
>>> re.search("^(.*)$\n^.*$", multiline_string, re.M)  # will match
<_sre.SRE_Match object at 0xb7f3e5e0>

Вам нужно что-то, чтобы соответствовать символам конца строки между $ и ^.

  • 0
    Очень хорошее наблюдение.
2

Вы должны использовать re.MULTILINE(или даже re.DOTALL, если вы меняете регулярное выражение и в зависимости от того, что вы действительно хотите совместить/делать)

re.MULTILINE

Если указано, символ шаблона '^' совпадает в начале строки и в начале каждой строке (сразу после каждого новая линия); и характер шаблона '$' в конце строки и в конце каждой строки (непосредственно перед каждой новой строкой).

По умолчанию '^' совпадает только с начало строки и только $$ в конце строки и непосредственно перед новой строкой (если любой) в конце строки.

http://docs.python.org/library/re.html

Кстати, с чем вы работаете - ^(.*\|.*)$^.*$ - это не очень хорошее регулярное выражение! (игнорируя тот факт, что у вас есть несколько $ и ^, которые являются точкой вопроса.)

  • 0
    Спасибо! Можно ли было не использовать функции Python? Я использую Regex в стиле Python в редакторе gedit, вместо программирования на Python.
  • 0
    @Tim Если это так, то на самом деле это не место для этого вопроса. Вы можете попробовать askubuntu.com
Показать ещё 2 комментария
2

Взгляните на re.MULTILINE.

Я цитирую:

Если указано, символ шаблона '^' соответствует началу строка и в начале каждого (сразу после каждого новая линия); и характер шаблона '$' соответствует в конце строки и в конце каждой строки (непосредственно перед каждой новой строкой).

По умолчанию '^' соответствует только начало строки и '$' только в конце строки и непосредственно перед новой строкой (если любой) в конце строки.

2

Чтобы добавить к другим ответам. Вы можете уйти с добавлением модификатора re.MULTILINE непосредственно в регулярное выражение:

(?m)^(.*\|.*)$\n^.*$
  • 0
    Вы сбросили обратную косую черту из \| ,
  • 0
    @ Алан Cheers, исправлено.
Показать ещё 1 комментарий
1

Я хотел бы обратиться к руководству regex python http://docs.python.org/library/re.html#re.MULTILINE

1

Префикс вашего регулярного выражения с помощью (? m) должен делать то, что вам нужно (сообщает движку регулярных выражений, что он будет получать многострочные тексты, и что ^/$соответствует началу/концу строки, а не всему тексту).

Изменить: посмотрев на ваше регулярное выражение немного больше, я думаю, вам также нужно поставить (? s), что означает, что вы хотите, чтобы точка соответствовала символам новой строки. Например:

(?m)(?s)^hello.*?world$

правильно подобранный "helloworld" для меня в таком случае:

dssdf
hello
world
sdfasdf
  • 0
    Мне кажется, что ОП хочет соответствовать ровно двум строкам; ему просто нужно преодолеть разрыв между ними, явно потребляя разделитель строк. Добавление (?s) меняет значение регулярного выражения, и оно все равно не будет работать из-за $^ в середине (как заметил @Andrew).
  • 0
    Конечно, я предлагаю отказаться от $ ^ в пользу чего-то другого. В любом случае, $ не соответствует реальному символу, поэтому \ n никогда не будет потребляться, а $ ^ вряд ли вообще что-либо совпадет. $ \ n ^ лучше, но я бы не использовал его, если бы знал, что что-то в следующей строке будет в порядке - я бы предпочел (? m) (? s) привет. *? $. +? $

Ещё вопросы

Сообщество Overcoder
Наверх
Меню