не могу найти три последовательных слова в строке, используя findall - PullRequest
0 голосов
/ 24 марта 2020

Я пытался найти имена в данном тексте, используя метод findall (). когда я использовал метод search (), я получал имя, присутствующее в тексте, но findall не работал вообще.

данный текст:

я пытался найти эти имена в BOLD

R120221325 ARYAN BAJAJ YASHWARDHAN MANISHA 716012335X SMDS Grd Crd IN TH [IN + TH] TW PR ИЛИ Всего% Crd Grd Pts ~~~~~~~ ~~~~~~~ ~ ~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~ ~~~ ~~ ~~ SEM.:1 406261 021/030 043/070 064/100 ------- ------- ------- 64 04 A 08 32 406261 ------- ------- ------ - ------- 040/050 ------- 80 01 O 10 10 406262 018/030 046/070 064/100 ------- ------- --- ---- 64 03 A 08 24 406262 ------- ------- ------- ------- ------- 040/050 80 01 O 10 10 406263 019/030 055/070 074/100 ------- ------- ------- 74 03 A + 09 27 406263 ------- --- ---- ------- 042/050 ------- ------- 84 01 O 10 10 406264D 024/030 043/070 067/100 ------- ------- ------- 67 03 A 08 24 406264D ------- ------- ------- ------- - ----- 040/050 80 01 O 10 10 406265D 016/030 050/070 066/100 ------- ------- ------ - 66 03 A 08 24 406266 ------- ------- ------- 045/050 ------- ------- 90 02 O 10 20 410249 C ------- ------- ------- PP ------- ------- PP 00 P 00 00 SEM.:2 406268 * 020/030 034/070 054/100 ------- ------- ------- 54 03 B 06 18 406268 * ------- ----- - ------- ------- ------- 044/050 88 01 O 10 10 406269 * 023/030 047/070 070/100 ------- - ------ ------- 70 03 A + 09 27 406269 * ------- ------- ------- ------- - ----- 043/050 86 01 O 10 10 406270 C * 024/030 053/070 077/100 ------- ------- ------- 77 03 A + 09 27 406270 C * ------- ------- ------- ------- ------- 040/050 80 01 O 10 10 406271B * 024/030 045/070 069/100 ------- ------- ------- 69 03 A 08 24 406273 * ------- --- ---- ------- 092/100 ------- ------- 92 04 O 10 40 406273 * ------- ------- - ------ ------- ------- 047/050 94 02 O 10 20 406274 * ------- ------- ------ - 042/050 ------- ------- 84 01 O 10 10 SGPA ЧЕТВЕРТЫЙ ГОД: 8,8, ВСЕГО КРЕДИТОВ, ЗАРАБОТАННЫХ: 44 B150084606 ДАЙРЯ ЯШРАЖ САЛУНКЕ HEENA 716012335X SMDS Grd Crd IN TH [IN + TH] TW PR ИЛИ Tot% Crd Grd Pts ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~ ~~~~ ~~~~~~~ ~~~ ~~ ~~~ ~~ ~~ SEM. : 1 406261 019/030 046/070 065/100 ------- ------- ------- 65 04 A 08 32 406261 ------- ---- --- ------- ------- 041/050 ------- 82 01 O 10 10 406262 022/030 047/070 069/100 ------- - ------ ------- 69 03 A 08 24 406262 ------- ------- ------- ------- --- ---- 043/050 86 01 O 10 10 406263 021/030 050/070 071/100 ------- ------- ------- 71 03 A + 09 27 406263 - ------ ------- ------- 045/050 ------- ------- 90 01 O 10 10 406264D * 025/030 040/070 065/100 ------- ------- ------- 65 03 A 08 24 406264D ------- ------- ------ - ------- ------- 045/050 90 01 O 10 10 406265D 024/030 044/070 068/100 ------- ------- --- ---- 68 03 A 08 24 406266 ------- ------- ------- 043/050 ------- ------- 86 02 O 10 20 410249 C ------- ------- ------- PP ------- ------- PP 00 P 00 00 SEM. : 2 406268 * 012/030 038/070 050/100 ------- ------- ------- 50 03 B 06 18 406268 * ------- - ----- ------- ------- ------- 041/050 82 01 O 10 10 406269 * 021/030 045/070 066/100 ----- - ------- ------- 66 03 A 08 24 406269 * - ----- ------- ------- ------- ------- 045/050 90 01 O 10 10 406270 C * 020/030 046 / 070 066/100 ------- ------- ------- 66 03 A 08 24 406270 C * ------- ------- ------- ------- ------- 040/050 80 01 O 10 10 406271B * 020/030 044/070 064/100 ------- --- ---- ------- 64 03 A 08 24 406273 * ------- ------- ------- 096/100 ------- - ------ 96 04 O 10 40 406273 * ------- ------- ------- ------- ------- 047 / 050 94 02 O 10 20 406274 * ------- ------- ------- 042/050 ------- ------- 84 01 O 10 10 ЧЕТВЕРТЫЙ ГОД SGPA: 8,66, ВСЕГО КРЕДИТОВ Заработано: 44

регулярное выражение, которое я написал:

re.compile(r'\s{1,}\w*\s{1,}?\w*\s{1,}?\w*\s{1,}').findall()

с помощью findall я получаю список пустых строк

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

Я смог получить это после сокращения всего текста до минимума, а затем включения значений между двумя 8 ди git число, за которым следует символ (как здесь R120221325, 716012335X)

, но если я смогу получить ответ, не уменьшив текст до минимума, это спасет массу неприятностей.

извините за такой длинный вопрос но я не могу найти ответ, который так долго пытался.

любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Вы можете использовать разницу в количестве интервалов.

Значения находятся в первой группе захвата.

\b[A-Z]\d{9}\s+((?:\w+\s)+\w+)(?:\s{2,}\w+)+\s+\d{9}[A-Z]\b

Пояснение

  • \b Граница слова
  • [A-Z]\d{9}\s+ Соответствует AZ, 9 цифр (вместо 8 di git число)
  • ( Захват группа 1
    • (?:\w+\s)+\w+ Повторите 1+ раз, сопоставляя 1+ символьных слов и один символ пробела, а затем 1+ символьных слов
  • ) Закрыть группу 1
  • (?:\s{2,}\w+)+ Повторите 1+ раз, сопоставляя 2 или более символов пробела и 1+ слов слова
  • \s+\d{9}[A-Z] Сопоставьте 1+ пробела, затем 9 цифр и символ AZ
  • \b Граница слова

Regex demo | Python демо

0 голосов
/ 24 марта 2020

Это потому, что \w* соответствует любому числу символов слова , включая 0 , поэтому ваше регулярное выражение сопоставляется в трех последовательных пробелах.

Измените свое регулярное выражение на:

r'\b[A-Z]+\s+[A-Z]+\s+[A-Z]+\b'

+ означает 1 или более вхождений, а не ноль или более.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...