2016-02-22 3 views
0

Я нашел тему Capturing group with findall?, но, к сожалению, она более простая и охватывает только группы, которые не перезаписываются.Findall vs поиск перезаписи групп в Python

Пожалуйста, давайте рассмотрим следующий пример:

S = "abcabc" # string used for all the cases below 

1. FindAll - нет групп

print re.findall(r"abc", S) # ['abc', 'abc']

Общая идея: Нет групп здесь, так что я не планирующим findall, чтобы возвращать список всех совпадений - подтвердите пожалуйста.

В этом случае: Findall ищет abc, находит его, возвращает, затем продолжает и находит второй.

2. FindAll - одна явная группа

print re.findall(r"(abc)", S) # ['abc', 'abc']

Общая идея: Некоторые группы здесь, так что я ожидаю findall вернуть список всех групп - подтверждение пожалуйста.

В этом случае: Почему два результата пока есть только одна группа? Я понимаю это так:

  • findall ищет abc,

  • считает,

  • помещает его в буфер группы памяти,

  • возвращает его

  • findall начинает искать abc и так далее ...

Является ли это обоснование правильным?

3. FindAll - перезапись группы

print re.findall(r"(abc)+", S) # ['abc']

Это выглядит примерно выше все же возвращает только один abc.Я понимаю это так:

  • findall ищет abc,

  • считает,

  • помещает его в буфер группы памяти,

  • не возвращение это потому, что RE сам требует продолжения,

  • находит другое abc,

  • помещает его в буфер памяти (группа перезаписывает предыдущий abc),

  • строка заканчивается поэтому поиск концы, а также.

Это рассуждение правильно? Я здесь очень конкретный, так что если что-то не так (даже мельчайшие детали), то, пожалуйста, дайте мне знать.

4. Поиск - перезапись группы

Search просматривает строку в поисках одной игре, так и re.search(r"(abc)", S)re.search(r"(abc)", S), а, очевидно, возвращать только один abc, то позвольте мне получить право на:

re.search(r"(abc)+", S) 
print m.group() # abcabc 
print m.groups() # ('abc',) 

a) Конечно, весь матч abcabc, но у нас все еще есть группы, поэтому могу ли я сделать вывод, что группы не имеют значения (несмотря на имя) для m.group()? И почему ничто не перезаписывается для этого метода?

На самом деле, эта функция группировки круглых скобок совершенно не нужна здесь - в таких случаях я просто хочу использовать круглые скобки, чтобы подчеркнуть, что нужно делать вместе, повторяя вещи, не создавая никаких групп регулярных выражений.

b) Может ли кто-нибудь объяснить механизм позади возврата abcabc (с точки зрения буферов и т. Д.) Аналогично тому, как я сделал в пуле ?

+2

Почему бы не закончить предыдущий вопрос первым? У вас есть 2 ответа там, и вы не представили никакой обратной связи. –

+0

Я понимаю, что у вас есть вопросы, это нормально. Но в том, как работает этот сайт, лучше всего отделить каждый вопрос, чтобы ответы на вопрос могли быть полными, а не частичными. Многое из того, что вы просите, также описано в документации модуля regex, и очень сложно понять, какие именно вопросы вы задаете, я предлагаю вам сначала провести какое-либо исследование, возможно, ваши вопросы уже есть ответы, иначе разделите ваши вопросы и дать достаточную информацию, чтобы каждый из них был автономным. Минимальный рабочий пример кода, с которым вы хотите помочь. –

+0

@Wiktor, я собирался понять, как сначала работают группы на Python, а затем вернуться к предыдущей теме, так как я должен признать, что ответы вашего и другого человека мне не совсем понятны. Мне было интересно, где задать свои вопросы, но, наконец, решил, что лучше разделить их, а не делать предыдущую тему слишком длинной. Ваш ответ только осознал, что мне нужно знать кое-какие знания, и я спросил об этом здесь. Если это не так, я могу поместить его туда, но я не могу себе представить, как это может быть более читаемым ... – Drizzt

ответ

1

Сначала позвольте мне высказать некоторые факты:

  • Значение матч (match.group()) является (суб) текст, который отвечает весь шаблон, определенный в регулярном выражении. Матчи могут содержать ноль или более группы захвата.
  • A значение захвата (match.group(1..n)) является частью матча (которое также может быть равно целому совпадению, если весь шаблон заключен в группу захвата) шаблон, заключенный в пару неотбеленных круглых скобок).
  • Некоторые языки могут предоставить доступ к коллекции захвата , то есть все значения, которые были записаны с помощью количественной группы захвата, такой как (\w{3})+. В Python это возможно с PyPi regex module, в .NET, с CaptureCollection и т. Д.

1: Нет групп здесь, так что я не ожидал findall вернуть список всех матчей - пожалуйста, проверьте.

  • Правда, только если есть захватывая группы определены в шаблоне, re.findall возвращает список захваченных submatches. В случае abc, re.findall возвращает список совпадений.

2: Почему два результата пока есть только одна группа?

  • Есть два матча, re.findall(r"(abc)", S) находит два матч в abcabc, и каждый матч имеет один submatch или захваченную подстроку, поэтому результирующий массив имеет 2 элемента (abc и abc).

3: Правильно ли это рассуждение?

  • The re.findall(r"(abc)+", S) ищет совпадения в виде abcabcabc и так далее. Он будет соответствовать ему в целом и сохранит последний abc в буфере группы захвата 1. Итак, я думаю, что ваши рассуждения верны. RE сам требует продолжить может быть уточнен как , так как совпадение еще не завершено (так как есть еще символы для двигателя регулярных выражений, чтобы проверить соответствие).

4: весь матч abcabc, но у нас еще есть группы здесь, так что я могу сделать вывод, что группы не имеют никакого отношения (несмотря на название) для m.group()?

  • Нет, последнее групповое значение сохраняется в этом случае. Если вы измените свое регулярное выражение на (\w{3})+ и строку до abcedf, вы почувствуете разницу, так как выход для этого случая будет edf. И почему ничто не перезаписывается для этого метода? - Итак, вы ошибаетесь, предыдущее значение группы захвата -, переписанное следующими.

5: Может ли кто-нибудь объяснить механизм за возвращение abcabc (в терминах буферов и т.д.) так же, как я сделал в 3 пули?

The re.search(r"(abc)+", S) будет соответствовать abcabc (матч, не захвата), потому что

  1. abcabc ищется abc слева направо.RE находит abc с самого начала и пытается найти другое abc прямо с места после первого c. RE помещает abc в буфер группы Capture 1.
  2. RE находит второй abc, перезаписывает буфер группы захвата # 1. Пытается найти еще abc.
  3. не найдено abc - вернуть совпадающее значение: abcabc.
+0

Спасибо за вашу помощь, теперь это почти полностью ясно для меня. Если бы я мог задать вам еще два вопроса: 1) Я спросил: «Могу ли я заключить, что группы не имеют значения (несмотря на имя) для m.group()?» *, И вы ответили * «нет» *, но смотрели ваше объяснение ** 5 **, где вы указали, что: a) группы были перезаписаны, что, конечно же, повлияло на метод 'm.groups()' 'значение захвата', b) весь матч был по-прежнему' abcabc', поэтому я думаю, что эта перезапись не повлияла на метод 'm.group()' - 'match value'. Затем выполняется утверждение, что групповая перезапись не имеет отношения к методу 'm.group()'? – Drizzt

+0

2) Что касается ** 2 **, что вы имеете в виду, говоря «каждый матч имеет один подделку или захваченную подстроку» *? Означает ли это, что у нас есть два совпадения 'abc' и' abc', и в то же время они делают '(abc)' и '(abc)' захваченные группы?Это было мое понимание, и в этой пуле я подумал, почему вторая захваченная группа не перезаписала первый, и я пришел к выводу, что первая группа была возвращена 'findall' раньше. Это правда? – Drizzt

+1

1) Я понимаю, что * переписывание группы не имеет значения *, что 'group()' (= 'group (0)') в качестве перезаписывания подвариантности * группы не произошло *. Нет, это неправильно, переписывание происходит с любой определенной группой захвата, которая соответствует последующим смежным подстрокам. 2) «r» (abc) »« pattern соответствует 2 последовательным «abc» в 'abcabc' (' abc' (1-й матч, 1 захват) + 'abc' (2-й матч, 1 захват). Нет количественной группы захвата здесь, таким образом, не происходит «переписывания». –

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