Как оптимизировать производительность регулярных выражений?
У меня очень длинное регулярное выражение. Мое регулярное выражение представляет собой комбинацию из 5000 или более фраз.
кроме того, текст, на котором я выполняю регулярное выражение, также огромен. Размер текста составляет около 5 кб.
поскольку регулярное выражение, а также входной текст огромны, для выполнения регулярного выражения требуется минимум 2 минуты, что неприемлемо в моем проекте.
Итак, я хотел бы знать, как я могу оптимизировать это. Один из способов, который я могу придумать, - разделить регулярное выражение и использовать несколько потоки для минимизации времени выполнения. Это правильный вариант или есть другой способ?
часть моего регулярного выражения выглядит так :
(САУ|АДР.сом-технологий|АДФ частного общества|ДПА|ДПА Индия прайвит лимитед|АИТ программного обеспечения услуги ПТЭ общества|АМК технологий частного общества|ANMSoft технологий частного общества|изменение информационных технологий частного общества|АСД глобальной Индия прайвит лимитед|АСД Индия прайвит лимитед|АСМ технологии частного общества|АХА Группа решений, Индия прайвит лимитед|Индия АХА технологии общества|Aarkay Инфонет частного общества|AbsolutData исследований и аналитики частные|компании Accenture Индия прайвит лимитед|Индия Услуги|Услуги П общества|услуги частного общества|Аксенчер|программное обеспечение Аксенчер частного общества|Accurum Индия прайвит лимитед|AceTechnologies МКП|Aclat МКП|AcmeCeeYess Softech частного общества|Adaequare Индия прайвит лимитед|Adaequare информация частного общества|Adea Международного частные общества|Adea технологий|Adeptra|Адити технологий|программных средств|ловкий бизнес-решений|ловкий и Claretdene Инфотех частного общества|Афрен "Инфотех" проектирование программного обеспечения предприятие общество с ограниченной ответственностью|Компания Agilent технологий международного частного общества|Акебоно мягкий технологий частного общества|AkebonoSoft технологий частного общества|Akmin технологий|алгоритму технологий частного общества|Allsec технологий частного общества|частная Альфонсо Informex общества|компания Altria клиента Услуги|альтруист Индия прайвит лимитед|компания Amdocs|компания Amdocs Центр развития Индия прайвит лимитед|компания Amdocs Центр развития Индии|американский CyberSystems|американская служба экспресс-Индия прайвит лимитед|американская фондовая биржа|Амрок ценных бумаг|Аниш Информационные технологии частного общества|Ankhnet информацию частного общества|вершина технологий частного общества|AppLabs|AppLabs технологий частного общества|Appshark Индии|мы обеспечения частного общества|Аквила технологий|Аркот исследований и разработок программного обеспечения собственной общества|частная Арсин систем общества|частная общества ascendum в решения|сайт askme программного обеспечения частного общества|частная Атос происхождения общества|происхождение Атос|Атос происхождения Индия прайвит лимитед|Aurigo программных технологий частного общества|Aurona технологий частного общества|автоматического отключения питания программные решения|Aztecsoft|БМК программного обеспечения Индия прайвит лимитед|Balasai чистые частные общества|частная Байон решения общества|Бука вычислительной общества|Birlasoft общества|Синяя птица-технологий частного общества|синий фонтан СМИ частные общества|Голубая звезда "Инфотех" |Боден МКП|Бостон|Braahamam продажи решений частного общества|Braahmam чистые решения частного общества|мозга мягкая технология частного общества|частная бригада корпорация общества|Бизнес-Связь автоматизация Индия прайвит лимитед|Бизнеслинк автоматизации частного общества|З. впереди информационных технологий Индия прайвит лимитед|С. Д. корпорации|холдинга Индия прайвит лимитед|ЦЕМ решения|ЦГИ информационных систем и консультантов по вопросам управления частного общества или CGI информационные системы частная общества или CGI информационной системы и консультантов по вопросам управления частного общества или CGI информации и управления частного общества или CGI Нетворкс|Сиско Системс Индия прайвит лимитед|КМЦ общества|COMSYS МКП|кор Шелл технологий|КПР программного обеспечения Индия прайвит лимитед|черный исполнительный поиск частного общества|УУ программных решений частного общества|КБК Индия прайвит лимитед|УСБ корп частного общества|решений общества Кембридж|Кембридж решения|Кембридж решения ПКС. Bhd / Откровенность Ind. private limited / искренность Индия частные общества|холст объявлений частные общества|Canvera|компания Capgemini бизнес-услуг Индии Limited|частная компания Capgemini)
Я использую C# для этого.
пожалуйста, просветите !!!!
5 ответов
Вы можете значительно улучшить производительность этого выражения путем добавления \b
в начале:
\b(ACS| ... |Z)
это предотвратит проверку каждого символа и вместо этого проверит каждое слово.
вы можете оптимизировать регулярное выражение с помощью атомная группировка или через притяжательные квантификаторы там, где это возможно.
кроме того, если у вас есть такие вещи, как .*
или .+
в вашем регулярном выражении, которое может быть реальной памятью/свиньями времени выполнения, замените их (притяжательными)классы символов (опять же, если это возможно).
для получения более конкретных ответов вам нужно опубликовать регулярное выражение.
удачи!
одна оптимизация заключалась бы в извлечении общих префиксов. Изменение обстоятельств, как
(This is some text|This is some other text)
to
This is some (text|other text)
это должно быть сделано на каждом уровне. Изменение обстоятельств, как
ABCD|ADCB|BACD|BADC|BCAD|BCDA|BDAC|BDCA|CABD
to
A(BCD|DCB)|B(A(CD|DC)|C(AD|DA)|D(AC|CA))|CABD
эта оптимизация такова, что движку регулярных выражений не придется тестировать одни и те же символы несколько раз.
это может быть достигнуто путем сортировки фаз и просмотра последовательных элементов. Будьте осторожны, чтобы не разбить мета-символов. Вы же не хотите разделиться в середине .*
или \.
.
другой способ-использовать Trie-структуру для поиска префиксов. Это более надежно, но немного сложнее.
Я знаю, что он старый, но все же...
"или" правила (в этом отношении все стандартные правила: concat, repeat и or) не требуют ручной оптимизации. При компиляции большинство движков regexp оптимизирует его. Иногда наоборот - слишком много групп может повлиять на производительность, так как движок должен сохранить матч каждой группы.
что действительно сильно влияет на производительность, это смотреть вперед и смотреть за правилами, которые не используются в вашем запросе.
в этом случае автор может добавить правило "\b " в начале и конце запроса, чтобы потребовать поиска всего слова, что значительно ограничит места, которые двигатель начнет сопоставлять.
пример с Python (существует также c-инструмент для оптимизации регулярных выражений вhttps://github.com/ksx123/regex-optimization):
import hachoir_regex
optimized = hachoir_regex.parse("(ACS|ADDR.com Technologies|ADP private limited|ADP|ADP India private limited|AIT Software Services PTE limited|AMK Technologies private limited|ANMSoft Technologies private limited|ANZ Information Technology private limited|ASD Global India private Limited|ASD India private Limited|ASM Technologies private limited|AXA Group Solutions India private limited|AXA technology India limited|Aarkay Infonet private limited|AbsolutData Research and Analytics private limited|Accenture India private limited|Accenture Services India|Accenture Services P Limited|Accenture Services private Limited|Accenture|Accenture Software Private Limited|Accurum India private limited|AceTechnologies Inc|Aclat Inc|AcmeCeeYess Softech Private Limited|Adaequare India private limited|Adaequare Info private limited|Adea International private limited|Adea Technologies|Adeptra|Aditi Technologies|Adobe Systems|Adroit Business Solutions|Adroit and Claretdene Infotech private limited|Affron Infotech|Agile Software Enterprise private limited|Agilent Technologies International private limited|Akebono Soft Technologies private limited|AkebonoSoft Technologies private limited|Akmin Technologies|Algorhythm Technologies private limited|Allsec Technologies private limited|Alphonso Informex private limited|Altria Client Services|Altruist India private limited|Amdocs|Amdocs Development Center India private limited|Amdocs Development Centre India|American CyberSystems|American Express Service India private limited|American Stock Exchange|Amrok Securities|Anish Information Technology private limited|Ankhnet Informations private limited|Apex Technologies private limited|AppLabs|AppLabs Technologies private limited|Appshark India|Apptix Software private limited|Aquila Technologies|Arcot R and D Software private limited|Arsin Systems private limited|Ascendum Solutions private limited|AskMe Software private limited|Atos Origin private limited|Atos Origin|Atos Origin India private limited|Aurigo Software Technologies private limited|Aurona Technologies private limited|Autopower Software Solutions|Aztecsoft|BMC Software India private limited|Balasai Net private limited|Bayon Solutions private limited|Beachwood Computing Limited|Birlasoft limited|Blue Bird Technologies private limited|Blue Fountain Media private limited|Blue Star InfoTech|Boden Inc|Boston|Braahamam Net Solutions private limited|Braahmam Net Solutions private limited|Brain Soft technology private limited|Brigade Corporation Private Limited|Business Link Automation India private limited|BusinessLink Automation private limited|C Ahead Info Technologies India private limited|C.D.I Corporation|CCG India private limited|CEM Solutions|CGI Information Systems and Management Consultants private limited|CGI Information Systems private limited|CGI Information System and Management Consultants private limited|CGI Information and Management private limited|CGI Netvorks|CISCO Systems India private limited|CMC Limited|COMSYS Inc|CORE SHELL TECHNOLOGIES|CRC Software India private limited|CRV Executive Search private limited|CS Software Solutions private Limited|CSC India private Limited|CSS Corp private limited|Cambridge Solutions Limited|Cambridge Solutions|Cambridge Solutions Sdn. Bhd|Candor Ind. private limited|Candor India private limited|Canvas Creatives private limited|Canvera|Capgemini Business Service India Limited|Capgemini private)")
len(str(optimized)) # has length 3048
в то время как исходная строка имеет длину 3399
. Чем больше строк, тем больше оптимизаций возможно. Это использует на hachoir-regex
библиотека. Вы можете использовать это в дополнение к добавлению \b
, как предложено.