используя pyparsing для анализа списка регулярных выражений (в буквальном смысле) - PullRequest
2 голосов
/ 23 ноября 2010

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

Например.нахождение '[AB]' в строке длины 1 должно быть примерно 1/13 (учитывая только заглавные буквы).

Существует ли обобщенный синтаксический анализатор регулярных выражений, который возвращает отдельные позиции / альтернативы?Я думаю о том, чтобы получить список позиций в качестве возврата ('[AB].A{2}' приведет к '[['A','B'],'.',['AA']')

Проблема заключается в разборе регулярных выражений с помощью pyparsing.Простые регулярные выражения - не проблема, но когда дело доходит до «альтернатив» и повторений, я заблудился: мне трудно анализировать вложенные выражения типа '((A[AB])|(AB))'.

Anyмысли?

Ответы [ 2 ]

2 голосов
/ 23 ноября 2010

Симуляция, а не расчет может быть подходящим способом.

Настройка совокупности репрезентативных текстовых строк.(Лингвисты назвали бы такой набор корпус .) Для любого заданного регулярного выражения найдите число строк, которым оно соответствует, и разделите на общее количество строк в вашем корпусе.

Ваш собственныйПример, дающий вероятность «[AB]» как 1/13, основан на этом способе мышления с использованием набора строк из одной заглавной буквы.Вы получили 1/13, увидев, что есть два совпадения из 26 строк в корпусе.

Создайте больший корпус: возможно, набор всех буквенно-цифровых строк до определенной длины или все строки ASCII вверхдо определенной длины, или словарь на ваш выбор.Размышление о том, какой корпус лучше всего подходит для вашей цели, - это хороший способ уточнить, что вы подразумеваете под «вероятностью».

0 голосов
/ 23 ноября 2010

Вы используете ['A', 'B'], чтобы сказать: или A или B. тогда вы можете поместить что-то вроде этого:

'[{'A', ['A', 'B']}, {'A', 'B'}]'

Там вы используете [] для "одного изэто "как использовать {} для" всего этого "

1/2 to '{'A', ['A', 'B']}'
   'A' => 1/1
   ['A', 'B'] => 1/2
   (1/1) * (1/2) = 1/2
   this (1/2) times the extern (1/2) = (1/4)
1/2 to '{'A', 'B'}' -> (1/26) to each.
Multiplify two times: 1/(26^2) and multiplify by the 1/2 = (1/(26^2))/2.

Now multiplify both:  (1/4) * ((1/(26^2))/2)

Это было очень плохое объяснение ... Я попробую ...

[] => Calc de probability: {probability of each term} / {num of terms}
{} => Calc de probability of each term and multiplify all

Понимаете?

...