мне интересно, о методах оптимизации для регулярных выраженийОптимизация регулярных выражений метода
Так что я пытаюсь разобрать каждый случай денег из 400k линии корпуса. Мне также необходимо было включить такие строки, как "$10,999.04"
, а также "one billion and six hundred twenty five thousand dollars"
и все, что между ними. Это требовало очень длинного регулярного выражения с несколькими экземплярами групп, как
MONEYEXPRESSION = '(?:\d\d?\d?(?:,?\d{3})*(?:\.\d+)?)'
(one|two|...|ninety[\s-]?nine|hundred|a hundred|MONEYEXPRESSION)((\s*and\s*|\s*-\s*|\s*)(one|two|...|ninety[\s-]?nine|hundred|a hundred|MONEYEXPRESSION))*
Даже более того, для того, чтобы потребовать его быть экземпляром денег и избежать соответствующих линий, такие как "five hundred people were at the event"
У меня есть 4 варианта OR-нут которые требуют, чтобы "$", "dollars?", or "cents?"
находился в определенных местах в предложении хотя бы один раз.
регулярное выражение почти 20 тыс. Символов! :(
Вы можете вообразить с выражением этого обширного, с любыми плохими практиками, это действительно добавляет к времени. Я выполнял это на корпусе в течение последних 2 часов, и он еще не завершил сопоставление. Мне было интересно, что некоторые из лучших практик для оптимизации и обрезки ненужного регулярного выражения: какие операции я использую, являются дорогими и могут быть дополнены для лучших. И если возможно есть только лучший способ решить эту проблему?
Возможно, вам нужно написать настоящий парсер вместо того, чтобы пытаться использовать регулярное выражение для всего. – Barmar
Поверьте мне, я хочу, но это задание, в котором я должен использовать регулярное выражение. Вот почему я не прошу разрешения, но для техник, чтобы заставить его работать разумно или свести к минимуму то, что я уже написал –
PCRE поддерживает рекурсию, поэтому вместо того, чтобы повторять выражение для чисел до 100, вы можете определить его один раз, а затем обратиться перед ним «сто» и «тысяча». – Barmar