Шаблон регулярного выражения с положительным взглядом вперед и назад - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть файл, похожий на:

maar beroepsmensen
    p( maar | <s> )     =  0.005859305 [ -2.232154 ]
    p( beroepsmensen | maar ...)    =  7.865118e-06 [ -5.104295 ] # <- first match: 7.865118e-06
    p( kunnen | beroepsmensen ...)  =  6.842439e-08 [ -5.104295 ]
    p( </s> | kunnen ...)   =  0.04018713 [ -1.395913 ]
1 sentences, 2 words, 0 OOVs
0 zeroprobs, logprob= -8.732362 ppl= 814.3052 ppl1= 23237.04

dan scootermobiel
    p( dan | <s> )  =  0.005859305 [ -2.232154 ]
    p( scootermobiel | dan)     =  0.827746 [ -9.106363 ] # <- second match: 0.827746
    p( he | scootermobiel)  =  0.2520393 [ -3.123365 ]
    p( </s> | he ...)   =  0.04499642 [ -1.346822 ]
1 sentences, 2 words, 0 OOVs

и список с некоторым словом, например, mylst = ['beroepsmensen', 'scootermobiel'].

Я хочу просмотреть список * l oop и найти первый номер в строке с рисунком p( ithwordfromlist | anotherword ) = 9.999999999. (Пожалуйста, смотрите выше для матчей, касающихся игрушечного примера). Обратите внимание, что другое слово после | может быть заменено тремя точками, и что число иногда состоит из структуры e-.

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

\d+(\.\d+)?(e-\d+)?(?=( )+\[) #the number of spaces after the number can vary too.

Однако мне не удалось написать положительный взгляд, который соответствует шаблон перед номером. Например, при просмотре в виде, подобном (?<=\=( )+), выдается ошибка Квантификатор внутри просмотра делает его нефиксированной шириной . (Возможно, использование lookbehind - не лучший подход, поэтому, пожалуйста, не стесняйтесь предлагать и другие решения.)

До сих пор я разбивал длинный файл на список строк и применял регулярные выражения к каждому элемент в этом списке. Тем не менее, я мог бы, конечно, также применить его во всем списке, если это будет быстрее. Поэтому, если у вас есть решения для обоих подходов, пожалуйста, дайте мне знать, тогда я сравню время выполнения. Thx !!!

Редактировать: вставить новые строки, которые начинаются со структуры p( word1 | word2 ) и не должны совпадать

Редактировать2: сделать вопрос более конкретным

1 Ответ

1 голос
/ 15 февраля 2020

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

\s*p\s*\(\s*\w+\s*\|\s*\w+\s*\)\s*=\s*([\de\-\.]+)\s*\[\s*[\-\.\de]+\s*\]\s*

Как видно здесь

Все, что вам нужно сделать, - это извлечь группу 1 из каждого матча.

Полный код будет выглядеть так:

import re

pattern = r'\s*p\s*\(\s*\w+\s*\|\s*\w+\s*\)\s*=\s*([\de\-\.]+)\s*\[\s*[\-\.\de]+\s*\]\s*'

f = """maar beroepsmensen
    p( maar | <s> )     =  0.005859305 [ -2.232154 ]
    p( beroepsmensen | maar )    =  7.865118e-06 [ -5.104295 ] # <- first match: 7.865118e-06
    p( </s> | beroepsmensen ...)    =  0.04018713 [ -1.395913 ]
1 sentences, 2 words, 0 OOVs
0 zeroprobs, logprob= -8.732362 ppl= 814.3052 ppl1= 23237.04

dan scootermobiel
    p( dan | <s> )  =  0.005859305 [ -2.232154 ]
    p( scootermobiel | dan)     =  0.827746 [ -9.106363 ] # <- second match: 0.827746
    p( </s> | scootermobiel ...)    =  0.04499642 [ -1.346822 ]
1 sentences, 2 words, 0 OOVs"""

print(re.findall(pattern, f))

Вывод будет ['7.865118e-06', '0.827746']

...