Как получить строку между несколькими стартовыми словами и несколькими конечными словами из строк с помощью Python? [Дубликат]

Это потому, что метод Scanner.nextInt не использует символ последней новой строки вашего ввода и, следовательно, newline потребляется в следующий вызов Scanner.nextLine .

Вы столкнетесь с аналогичным поведением, когда вы используете Scanner.nextLine после Scanner.next() или любого метода Scanner.nextFoo (кроме самого nextLine).

Обход проблемы:

  • Пропустить пустой Scanner.nextLine вызов после Scanner.nextInt или Scanner.nextFoo, чтобы потреблять остальную часть этой линии, включая newline
    int option = input.nextInt();
    input.nextLine();  // Consume newline left-over
    String str1 = input.nextLine();
    
  • Или было бы еще лучше, если вы прочитаете ввод через Scanner.nextLine и преобразуете свой ввод в нужный формат. Например, к целому числу с использованием метода Integer.parseInt(String) .
    int option = 0;
    try {
        option = Integer.parseInt(input.nextLine());
    } catch (NumberFormatException e) {
        e.printStackTrace();
    }
    String str1 = input.nextLine();
    

1
задан Jonny 5 29 August 2015 в 09:33
поделиться

5 ответов

Интересной особенностью модуля regex является именованный список. При этом вам не нужно включать несколько альтернатив, разделенных | в группе без захвата. Вам нужно только определить список раньше и ссылаться на него в шаблоне по его имени. Пример:

import regex

words = [ ['a', 'the', 'one'], ['reason', 'reasons'], ['for', 'of'] ]

pattern = r'\m \L<word1> \s+ \L<word2> \s+ \L<word3> \M'
p = regex.compile(pattern, regex.X, word1=words[0], word2=words[1], word3=words[2])

s = 'the reasons for'

print(p.search(s))

Даже если эта функция не является существенной, она улучшает читаемость.

Вы можете добиться чего-то подобного с re-модулем, если вы присоединитесь к элементам с | до:

import re

words = [ ['a', 'the', 'one'], ['reason', 'reasons'], ['for', 'of'] ]

words = ['|'.join(x) for x in words]

pattern = r'\b ({}) \s+ ({}) \s+ ({}) \b'.format(*words)

p = re.compile(pattern, re.X)
1
ответ дан Casimir et Hippolyte 21 August 2018 в 15:19
поделиться

Используйте круглые скобки для группировки:

'\b(a|the|one) reason(|s) (for|of)\b'

Я оставил предложение-internal \b, так как из них вытекают пробелы: пробел, следующий за буквой, всегда является границей слова. В общем, вы должны поместить \b за пределы альтернатив;

Если это имеет значение, вы можете использовать «не захватывающие группы» во всех современных двигателях с регулярным выражением: используйте (?:stuff) вместо (stuff). Но если это не имеет значения для ваших целей, или вам нужно знать, какие из слов на самом деле присутствуют, перейдите к простым парам.

1
ответ дан alexis 21 August 2018 в 15:19
поделиться

Модификатор регулярного выражения A|B означает, что «если совпадают либо A, либо B, то все это соответствует». Таким образом, в вашем случае результирующее регулярное выражение соответствует if / where any из следующих 5 регулярных выражений:

  • \ba\b
  • \bthe\b
  • \bone\b \breason\b
  • reasons\b \bfor\b
  • \bof\b

Чтобы ограничить степень к которому применяется |, используйте неудерживающую группировку для этого, то есть (?:something|something else). Кроме того, для необязательного s в конце reason вам не нужно использовать изменения; это точно равно reasons?.

Таким образом, мы получаем регулярное выражение \b(?:a|the|one) reasons? (?:for|of)\b.

Обратите внимание, что вам не нужно использовать граничные операторы слова \b в пределах регулярное выражение, только в начале и в конце (в противном случае оно будет соответствовать чему-то вроде everyone reasons forever).

3
ответ дан Antti Haapala 21 August 2018 в 15:19
поделиться
  • 1
    Вы правы в отношении s?, но вопрос состоял в том, чтобы группировать альтернативы, а не искать reason|reasons – alexis 29 August 2015 в 09:05
  • 2
    @alexis, вы ошибаетесь. Вопрос заключался не в группировании альтернатив. Вопрос состоял в том, как написать регулярное выражение , чтобы он соответствовал шаблону, как / / причина / причины для / of . – Antti Haapala 29 August 2015 в 09:09

Как я понимаю, вы хотите, чтобы какое-то регулярное выражение выглядело так:

(?:a|the|one)\s+(?:reason|reasons)\s+(?:for|of)

Это так просто, просто объедините их с помощью групп .

см .: DEMO

Обратите внимание на ваше требование выше, его звук для меня не настолько строгий, если вы хотите что-то изменить самостоятельно, давайте рассмотрим объяснение ниже

Объяснение

(?:abc|ijk|xyz)

Любое слово abc, ijk или xyz, сгруппированное по группе без захвата (?:...), означает, что это слово не будет записываться в regex variable $1, $2, $3, ....

\s+

Это разделитель слов, который здесь я устанавливал как любые пробелы, + обозначает 1 или более.

1
ответ дан fronthem 21 August 2018 в 15:19
поделиться

Вам нужно использовать группу захвата, чтобы отказаться от смешивания OR (|)

(\ba\b|\bthe\b|\bone\b) (\breason\b|reasons\b) (\bfor\b|\bof\b)

. И затем, как более элегантный способ, вы можете поместить границы слов вокруг групп. Также обратите внимание что, когда вы используете пространство в своем регулярном выражении вокруг слов, нет необходимости использовать границу слова. И для reasons и reason вы можете сделать последний s опционным с ?. И обратите внимание, что если вы не хотите, чтобы ваши слова соответствовали отдельным группам, вы можете сделать группы группами, не имеющими захвата, :?.

\b(?:a|the|one) reasons? (?:for|of)\b

Или использовать группу захвата, если вы хотите, чтобы слова в группе:

\b(a|the|one) (reasons?) (for|of)\b
3
ответ дан Kasramvd 21 August 2018 в 15:19
поделиться
  • 1
    Нет, вам не нужно и не должно – Antti Haapala 29 August 2015 в 09:00
  • 2
    @AnttiHaapala Почему бы и нет? в этом случае он будет воспринимать \bone\b \breason\b как одну часть. regex101.com/r/gD4nI3/1 – Kasramvd 29 August 2015 в 09:03
  • 3
    Вы сказали «вам нужно использовать группу захвата». Вам не нужно, и вам не следует, вы должны использовать группы, не связанные с захватом, поскольку у них, вероятно, будет меньше накладных расходов (а в некоторых случаях группы захвата ведут себя по-другому). – Antti Haapala 29 August 2015 в 09:07
  • 4
    @AnttiHaapala Да, они отличаются тем, что я предложил группе захвата для ограничения поведения pip (OR)! – Kasramvd 29 August 2015 в 09:09
Другие вопросы по тегам:

Похожие вопросы: